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;} };
更簡單的方法,記錄當前最大的結果,因為每遇到一個數,可能有兩種可能,一是加這個數,二是從這個數開始。 那我們就要找當前的最優(yōu)情況與歷史最優(yōu)情況比較。
和可能的結果:
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;} };
?
這是一個最優(yōu)化問題,最優(yōu)化問題一般都可以用DP(動態(tài)規(guī)劃)解決。 對于動態(tài)規(guī)劃,要考慮子問題是什么(形式的子問題或狀態(tài)的子問題)子問題就可以用recursive solution。
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];elsedp[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);?
?
轉載于:https://www.cnblogs.com/fanhaha/p/7222002.html
總結
以上是生活随笔為你收集整理的leetCode 53. maximum subarray的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 学习使用按位取反.
- 下一篇: 几何约束栏设置不包括_2011CAD考试