关于这个程序是我的第一个作为团队的一员开发的项目,体会较深的是团队开发不同于自己一个人开发,要同时顾及到团队成员的感受,以及要对自己的代码进行一定的规范方便其他成员的理解,而且,我感觉最开始的团队合作是有点困难的,只是刚刚在一起会有不少矛盾,也许是因为每个人都习惯了自己单独开发,而且值得注意的是,多人开发的时候会出现分工不明确的事情,就现在来说,感觉还是在自己一个人开发,同时都去写这个程序,并没有真正的合作,还是各顾各的。以上是这次写这个小程序自己的一些体会。
下边关于这个程序,最开始的想法是在给一个给定的数组,先找出第一个非负的数据并确定其下标,在一次相加,用一个int型变量result来记录和的值,用max来记录最大值,在用string类型的变量output来记录参与相加的数据下标的,result与max进行比较,当result大于max时将result值赋给max,同时定义一个String类型的变量out用来记录此时的output值,这样就实现了在时间复杂度为O(n)的条件下找出最大子数组及和。这里存在的问题是max值最先赋值为0,所以需要在全为负数的时候进行判断result的值若为0,依次比较大小找出其中最大的一个。代码如下
import java.util.Scanner; public class Hechaxun { static Scanner str=new Scanner(System.in); public static void main(String args[]) { int shuzu[]={-1,3,-3,2,-1,1,4,5,-1}; judge(shuzu); } public static void judge(int shuzu[])//最大的子数组 { int max = 0; int result = 0; int index=0; String output=""; String out=""; for(int i=0;i<shuzu.length;i++) { if(shuzu[i]>=0) { index=i; break; } } for(int i=index;i<shuzu.length;i++) { result=result+shuzu[i]; output=output+""+i; if(result<0) { result=0; output=""; } if(result>max) { max=result; out=output; System.out.println(max); } } System.out.println(out); System.out.println(max); } }
上边是一段用于调试的代码;
接下来是将上述的数组变为一个循环数组的代码,具体的思想是建立在以上代码的基础上,在定义一个长度为2n-1的数组shuzu2,来实现所谓的循环数组,就是将存放初始值的数组通过for套for的循环方式赋值给新定义的shuzu2中,在通过上述思想去找最大值代码如下
public class Hechaxun { public static void main(String[] args) { int a[]={-3,-1,-2,-1,-4,-8}; System.out.println("最大子数组的值为:"+findMaxSum(a)); } public static int findMaxSum(int[] arr) { int curSum = 0; int maxSum = 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++) { curSum = arr[i]; if(arr[i]>=0) { start = i; for (int j = i+1; j <len+i; j++) { curSum += arrcir[j]; if (curSum < 0) { curSum = 0; start = j; } if (curSum >=maxSum) { maxSum = curSum; end = j; begin[j] = start; } } } } String out = ""; System.out.println(start+" "+end); for(;begin[end] <= end;begin[end]++) { out = out + " "+arrcir[begin[end]]; } System.out.println("最大子数组为: "+out); // all data are negative if (maxSum == 0) { for (int i = 0; i < len; i++) { if (i == 0) { maxSum = arr[i]; } if (arr[i] > maxSum) { maxSum = arr[i]; } } } return maxSum; } }