·设计思想
(1)首先做出来的是不首尾相接的数组,求其最大数组和它的和,其主要思路是:先找到其数组和的最大值,然后再记录其取最大值的数组元素的下标。求最大值,首先,初始化变量最大值,初值设为零遍历整个数组,数组元素每加一次记录其和的结果,将其和最大值比较,大于最大值,就将和的值赋给最大值,其中,如果和值为负数,在加下一个数组元素时,记录和值的变量先要重新赋值为零,这样最后遍历完之后。最大值就求出来了。其次,记录其下标,用字符串记录下标,读取时用charAt读取第一个下标,至于最后的一个下标,则是记录当最大值发生被替换时,此时的下标,就是最后一个!最后,结尾的完善工作就好做了,把读取的start下标转化成int型,for循环将其对应下标的数组元素输出,将最大值输出
(2)首尾相接的数组,基本思路是用两个for循环,把首尾相接的数组拆分成一个个数组,每次拆分都是一个长度为原先数组长度的数组,在每个里面找最大的子数组,将这个问题再次变成求首尾不相接的数组
·代码
public class Tes { public static void main(String[] args) { int a[]={-3,-1,2,-3,-4,-2}; System.out.println("最大子数组的值为:"+fun(a)); } public static int fun(int[] arr) { int he = 0; int max = 0; int len = arr.length; int start = 0; int end = 0; int[] begin = new int[len*2-1]; int[] arrcir = new int[len*2-1]; for(int i=0;i<len;i++) { arrcir[i] = arr[i]; } for(int i=0;i<len-1;i++) { arrcir[len+i] = arr[i]; } if (arr == null || len == 0) { System.out.println("数组为空!!!"); } for(int i=0;i<len;i++) { he = arr[i]; if(arr[i]>=0) { start = i; for (int j = i+1; j <len+i; j++) { he += arrcir[j]; if (he < 0) { he = 0; start = j; } if (he >= max) { max = he; end = j; begin[j] = start; } } } } String out = ""; System.out.println(start+" "+end); for(;begin[end] <= end;begin[end]++) { out = out + " "+arrcir[begin[end]]; } if (max == 0) { for (int i = 0; i < len; i++) { if (i == 0) { max = arr[i]; } if (arr[i] > max) { max = arr[i]; start = end = i; } } out = arr[end] + ""; } System.out.println("最大子数组为: "+out); return max; } }
·结果截图