求数组的子数组和最大值

用Java实现的,有兴趣的自己瞅瞅吧..

public class main {

	/**
	 * @param args
	 */
	
	public static int MaxSubArraySum(int[] array,int length)
	{
		if(length == 0)
			return 0; 
		int sum = Integer.MIN_VALUE, cur_sum = array[0];
		for(int i = 1; i < length; i++)
		{
			if(cur_sum < 0)
				cur_sum = 0;
			cur_sum = cur_sum + array[i];
			if(sum < cur_sum)
			{
				sum = cur_sum;
			}
		}
		return sum;
	}
	public static int MaxSubArray(int[] array,int length)
	{
		if(length == 0)
			return 0; 
		int sum = Integer.MIN_VALUE, cur_sum = array[0];
		int start = 0, end = 0, tmp = 0;
		for(int i = 1; i < length; i++)
		{
			if(cur_sum < 0)
			{
				cur_sum = 0;
				tmp = i;
			}
			cur_sum = cur_sum + array[i];
			if(sum < cur_sum)
			{
				sum = cur_sum;
				start = tmp;
				end = i;
			}
		}
		System.out.println("MaxSubArray:"+start + " "+end);
		return sum;
	}
	public static int Brute_Force_Max_SubArray(int[] array,int length)
	{
		if(length == 0)
			return 0; 
		int sum = Integer.MIN_VALUE,cur_sum = 0;
		int start = 0,end = 0;
		for(int i = 0; i < length; i++)
		{
			cur_sum = 0;
			for(int j = i; j < length; j++)
			{
				cur_sum += array[j];
				if(cur_sum > sum)
				{
					sum = cur_sum;
					start = i;
					end = j;
				}
			}
		}
		System.out.println("Brute_Force_Max_SubArray:"+start + " "+end);
		return sum;
	}
	
	
	
	public static int  Max_SubArray_Ring(int[] array,int length)	//首尾相连
	{	
		
		int sum_nonering = MaxSubArraySum(array,length);		//先考虑首尾不相连的最大值
		
		int left = 0,leftsum = Integer.MIN_VALUE, leftcur_sum = 0;
		for(int i = 0; i < length; i++)
		{
			leftcur_sum = leftcur_sum + array[i];
			if(leftsum < leftcur_sum)
			{
				leftsum = leftcur_sum;
				left = i;
			}
		}
		
		int right = 0, rightsum = Integer.MIN_VALUE, rightcur_sum = 0;
		for(int i = length-1; i >= 0; i--)
		{
			rightcur_sum = rightcur_sum + array[i];
			if(rightsum < rightcur_sum)
			{
				rightsum = rightcur_sum;
				right = i;
			}
		}
		
		if(left < right)
		{
			if(sum_nonering < (leftsum+rightsum))
				return (leftsum+rightsum);
			else
				return sum_nonering;
		}
		else
		{
			int minStart=0;  
			int minAll=0;  
			for(int i=0;i<length;i++)				//计算子数组最小值
			{
				if(minStart > 0)
					minStart = 0;
				minStart = array[i] + minStart;  
				if(minAll > minStart)
					minAll = minStart;
			}  

			int ringsum = leftsum+rightsum;
			for(int i = right; i <= left; i++)		//删除重复计算的元素,得到数组的全和
				ringsum = ringsum - array[i];
			
			int maxsum_ring = ringsum - minAll;
			
			if(sum_nonering < maxsum_ring)
				return maxsum_ring;
			else
				return sum_nonering;
		}
		
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] array = {3,-2,3}; 
		System.out.println("result:"+MaxSubArraySum(array,array.length));
		System.out.println("result:"+MaxSubArray(array,array.length));
		System.out.println("result:"+Brute_Force_Max_SubArray(array,array.length));
		System.out.println("result_ring:"+Max_SubArray_Ring(array,array.length));
		return;
	}

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值