最大子数组及其和

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

下边关于这个程序,最开始的想法是在给一个给定的数组,先找出第一个非负的数据并确定其下标,在一次相加,用一个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;
	}
}

  

posted on 2017-03-31 19:47  发酸的土豆  阅读(132)  评论(0编辑  收藏  举报