leetCode 53. 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
.
贪婪算法找每个当前位置对应的最大的subarray,
class Solution { public: int maxSubArray(vector<int>& nums) { int n=nums.size(); vector<int> eachnum; int sum=0; for(int i=0;i<n;i++) { if(sum<0) { sum=0; } sum+=nums[i]; eachnum.push_back(sum); cout<<sum<<endl; // eachnum[i]=sum; } vector<int>:: iterator biggest=max_element(eachnum.begin(),eachnum.end()); return *biggest; } };
更简单的方法,记录当前最大的结果,因为每遇到一个数,可能有两种可能,一是加这个数,二是从这个数开始。 那我们就要找当前的最优情况与历史最优情况比较。
和可能的结果:
class Solution { public: int maxSubArray(vector<int>& nums) { int adj_sum = 0; int cont_sum = nums[0]; for (vector<int>::iterator it = nums.begin(); it<nums.end(); it++) { adj_sum+=*it; adj_sum = max(adj_sum, *it);//记录加当前数与从当前数开始的最大值 cont_sum = max(cont_sum, adj_sum);// 比较当前的最大值与历史最大值,记录最大值 } return cont_sum; } };
这是一个最优化问题,最优化问题一般都可以用DP(动态规划)解决。 对于动态规划,要考虑子问题是什么(形式的子问题或状态的子问题)子问题就可以用recursive solution。
- 对于 maxSubArray( int a[], int i,int j), is searching for the maxSubArray for a[i:j]
- the goal is to figure out what maxSubArray(A,0,A.length()-1) is.
- 对于maxSubArray(int a[], int i, int j) is difficult ot connect this sub problem to the original, so we change the format of the sub problem to maxSubArray(int a[], int i), which means the maxSubArray for A[0:i]. which must has A[i] as the end. so we should keep track of each solution of the sub problem to update the global optimal value.
maxSubArray(A,i)=maxSubArray(A, i-1)>0?maxSubArray(A, i-1):0+A[i];
so the solution is same as the previous one:
int maxSubArray(vector<int> & nums) { int n=nums.size(); int num=0; int* dp=new int[n]; dp[0]=nums[0]; int maxsum=nums[0]; for (int i=1;i<n;i++) { if(dp[i-1]<0) dp[i]=nums[i]; else dp[i]=dp[i-1]+nums[i]; cout<<dp[i]<<" "<<dp[i-1]<<endl; maxsum=max(maxsum,dp[i]); cout<<maxsum<<endl; } return maxsum; }
开始写 dp[i]=nums[i]+dp[i-1]>0?dp[i-1]:0; 有错哈哈, 忘了带括号
dp[i]=nums[i]+(dp[i-1]>0?dp[i-1]:0);