leetcode maximum subArray

题目为:

Find the contiguous subarray within an array (containing at least one number) which has the largest sum.

For example, given the array [−2,1,−3,4,−1,2,1,−5,4],
the contiguous subarray [4,−1,2,1] has the largest sum = 6.

这个解法的思路很简单。设两个变量,一个是如果以当前元素为最长子数组的最后一个元素,所能达到的最大值max_ending_here。另一个是已知的最大值max_so_far。

其实是一个动态规划问题。

 
max_subarray(A[n]) = max( max_subarray(A[n-1]), A[n], max_subarray(A[n-1)(+)A[n] );  

也就是说,已知一个数组A[n]及其最大子数组max_subarray(A[n]),我们添加一个元素A[n+1]进去。则有三种可能的情况:

1. 添加进去元素的数组A[n+1]不影响A[n]的最大子数组。

2. 单独的A[n+1]

3. 以max_subarray(A[n])和A[n+1]以及两者之间的元素组合起来生成的数组。

其中,如果在增长过程中,现有的数组段的和是负数,马上就可以抛弃,因为在这种情况下,max_subarray要是包含这一段,值肯定会比不包括这一段要大。

代码

	    int maxSubArray(int A[], int n) {  
		        int max = Integer.MIN_VALUE;  
		        int sum = Integer.MIN_VALUE;  
		        for(int i=0;i<n;i++)  
		        {  
		            sum = sum<0?A[i]:A[i]+sum;  
		            if(sum>max)  
		                max=sum;  
		        }  
		        return max;  
		    }  
		

  

原文地址:https://www.cnblogs.com/elnino/p/5473543.html