关于这个程序是我的第一个作为团队的一员开发的项目,体会较深的是团队开发不同于自己一个人开发,要同时顾及到团队成员的感受,以及要对自己的代码进行一定的规范方便其他成员的理解,而且,我感觉最开始的团队合作是有点困难的,只是刚刚在一起会有不少矛盾,也许是因为每个人都习惯了自己单独开发,而且值得注意的是,多人开发的时候会出现分工不明确的事情,就现在来说,感觉还是在自己一个人开发,同时都去写这个程序,并没有真正的合作,还是各顾各的。以上是这次写这个小程序自己的一些体会。
下边关于这个程序,最开始的想法是在给一个给定的数组,先找出第一个非负的数据并确定其下标,在一次相加,用一个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;
}
}