问题为:就是在前面数组的基础上将数组收尾相接,仍求连续子数组的和最大值。
解决这个问题的关键就是理清思路,其实它就是相当于在原来数组的最后一位上接了前面几个数字,比如原来为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);
}
以后在遇到此类问题时一定要先理清思路再下手,切不可没有想好就开始做。