题目是:一维循环的数组求出最大子数组的和
老师刚给出这个题目时 ,求出一维子数组的最大子数组的和,当时我就想原来已经做过一个求出一维数组的最大子数组的和,能不能在此基础上延伸一下,于是我就想怎样利用原来的算法,后来我就想既然是还是求出最大子数组的和肯定原来的东西可以利用。
我想既然是循环,无外乎就是这个数组进行两遍,所以我感觉这样就可以再在这个数组后面申请一个和它长度相同,数的大小和顺序和它一样的数组,这样就起到了循环的目的,于是我就这样进行了,然后再调用原来的方法,这样就可以求出最大子数组的值了。于是我把程序写出来,运行结果发现是错误的。最子数组的和不是原来的不是预期的结果,于是我就想问题出在哪里了,后来我发现了原来问题是最大子数组的长度出现了问题,既然已经把数组的长度扩大一倍,于是子数组的长度可能也会发生变化,这时我就想到需要在子数组的长度上加上一些限制,让他的长度永远小于原来数组的长度,这样很好的解决子数组长度的问题中、这样求出来的子数组就是符合要求的 。
package shengcheng; import java.util.Scanner; import org.junit.Test; public class Xunhuan { @Test public void fun() { int []a=new int [10]; int n; Scanner write=new Scanner(System.in); System.out.println("请输入要输入的数组的长度"); n=write.nextInt(); for(int i=0;i<5;i++){ a[i]=write.nextInt(); } xunhuan(a,n); } public void xunhuan(int a[],int n) { int temp=-200000; int Max=-200000; for(int i=0;i<n;i++ ) { a[i+n]=a[i]; } for(int i=0;i<n;i++) { temp=-200000; for(int j=i;j<n+i;j++) { temp+=a[j]; if(temp>Max) { Max=temp; } if(temp<0) { temp=a[j]; } } } System.out.println(Max); } }
运行结果截图: