• 个人作业3-数组(带子问题,首尾相连)


    问题为:就是在前面数组的基础上将数组收尾相接,仍求连续子数组的和最大值。

    解决这个问题的关键就是理清思路,其实它就是相当于在原来数组的最后一位上接了前面几个数字,比如原来为3 -2 5 -1,然后首尾相接以后变成了 3 -2 5 -1 3 -2 5,这时候可以将其组合成一个新数组,

    int[] array3=new int[2*n-1];
    		
    		for(int j=0;j<n;j++) {
    			array3[j]=array[j];
    					}
    		for(int i=n;i<2*n-1;i++)
    		array3[i]=array[i-n];
    		for(int i=0;i<2*n-1;i++) {
    			System.out.print(array3[i]+" ");
    		}
    		System.out.print("
    ");
    

     然后要注意新的数组求出来的最大连续子数组的长度不能超过原来数组的长度,本例即4.

    if((max<sum)&&(j-i+1<=n)) {
    				max=sum;
    			}
    

     然后在原来的基础上加上这两步即可

    package array;
    
    import java.util.Scanner;
    
    import java.io.*;
    import java.math.BigDecimal;
    
    public class array1 {
    
    	
    	public static void main(String[] args) {
    		// TODO 自动生成的方法存根
    		Scanner sc=new Scanner(System.in);
    		System.out.println("请输入数组的长度");
    		int n=sc.nextInt();
    		int array[]=new int[n];
    		int array2[]=new int[n];
    		System.out.println("请依次输入数组的每个值");
    		for(int i=0;i<n;i++) {
    			 array[i]=sc.nextInt();
    		}
    		for(int i=0;i<n;i++) {
    			array2[i]=0;
    		}
    		int max;
    		int[] array3=new int[2*n-1];
    		
    		for(int j=0;j<n;j++) {
    			array3[j]=array[j];
    					}
    		for(int i=n;i<2*n-1;i++)
    		array3[i]=array[i-n];
    		for(int i=0;i<2*n-1;i++) {
    			System.out.print(array3[i]+" ");
    		}
    		System.out.print("
    ");
    		for(int i=0;i<n;i++) {
    			max=array3[i];
    			int sum=0;
    			System.out.print("abc"+max+" ");
    			for(int j=i;j<2*n-1;j++) {
    				sum=sum+array3[j];
    			if((max<sum)&&(j-i+1<=n)) {
    				max=sum;
    			}
    			}
    				array2[i]=max;	
    				System.out.println("def"+max);
    		} 
    		int k=array2[0];
    		for(int i=0;i<n;i++) {
    			System.out.println("ghi"+array2[i]);
    		}
    		for(int i=0;i<n;i++) {
    			if(array2[i]>k) {
    				k=array2[i];
    			}
    		}
    				
    		/*1 2 3 4 5 1 2 3 4
    		 * n+n-1
    		 *6 -7 9 -3 5
    		 * 1 1+n
    		 * 2 2+n
    		 * 1 2 3 4 1 2 3
    		 * 2 3 4 1
    		 * 3 4 2 1
    		 * */
    		System.out.println("最大值"+k);
    	}
    	}
    	
    	
    

     总结:

    这个题并不难可是自己却并没有在规定的时间内完成,主要原因是忽略了一个细节

    for(int i=0;i<n;i++) {    /*虽然首尾相接了,并把它放到了一个新的数组里,但是实际上数组并没有扩大,所以仍然是循环N次。*/
                max=array3[i];
                int sum=0;
                System.out.print("abc"+max+" ");
                for(int j=i;j<2*n-1;j++) {
                    sum=sum+array3[j];
                if((max<sum)&&(j-i+1<=n)) {
                    max=sum;
                }
                }
                    array2[i]=max;    
                    System.out.println("def"+max);
            }

    以后在遇到此类问题时一定要先理清思路再下手,切不可没有想好就开始做。

  • 相关阅读:
    Coding Souls团队---电梯演讲
    第一次团队会议总结-NABCD分析
    软件工程团队项目介绍
    python进行四舍五入
    python列表元素两两比较
    Linux常用命令
    谷歌日历的正确用法--在谷歌日历中添加农历、天气、中国节假日
    Nose框架的安装
    python中staticmethod装饰器的作用
    python 3.x与python 2.7.x在语法上的区别
  • 原文地址:https://www.cnblogs.com/zzstdruan1707-4/p/10588785.html
Copyright © 2020-2023  润新知