leetcode-53-Maximum Subarray
2015-07-10 16:47
309 查看
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.
最大子串和问题。求连续的子数组的最大和。
比较简单的方法,
class Solution { public: int maxSubArray(vector<int>& nums) { int n=nums.size(); int s=0; int max_=nums[0]; for(int i=0;i<n;i++){ s+=nums[i]; if(max_<s) max_=s; // 如果大于最大值 就更新最大值 if(s<0) s=0; // s<0 就从下一个数开始 重新记数 } return max_; } };
DP 参考 七月算法-动态规划
dp[i]是以nums[i]结尾的最大子数组的和,
dp[i]=max(dp[i-1]+nums[i],nums[i])
最后的结果为dp[0~n-1]的最大值
class Solution { public: int maxSubArray(vector<int>& nums) { int n = nums.size(); int dp ;// dp[i]是 以nums[i]结尾的最大子数组的和 dp[0]=nums[0]; int max_=nums[0]; for(int i = 1;i < n;i++){ dp[i] = max(dp[i-1]+nums[i],nums[i]); max_ = max(dp[i],max_); } return max_; } };
空间优化
不用一位数组
class Solution { public: int maxSubArray(vector<int>& nums) { int n = nums.size(); int cur=nums[0]; int max_=nums[0]; for(int i = 1;i < n;i++){ cur = max(cur+nums[i],nums[i]); max_ = max(cur,max_); } return max_; } };
分治
把数组分成等长的两部分,最大子数组和要么在最左边,要么在右边,或跨越左右两边
int max(int a,int b){ return a>b?a:b; } int merge(int* nums,int s,int t){ if(s == t) return nums[t]; int mid = (s + t) >> 1; int max_ = max(merge(nums,s,mid),merge(nums,mid + 1,t)); // s..mid 与 mid + 1..t的最大和 int leftmax = nums[mid],rightmax = nums[mid + 1],cur; // 即左右部分的最大和 cur = leftmax; for(int i = mid - 1;i >= s;i--){ // 以mid结尾的 最大和 cur += nums[i]; leftmax = max(cur,leftmax); } cur = rightmax; for(int i = mid + 2;i <= t;i++){ // 以mid+1开始的 最大和 cur += nums[i]; rightmax = max(cur,rightmax); } return max(max_,leftmax + rightmax); // 返回最大和 } int maxSubArray(int* nums, int numsSize) { return merge(nums,0,numsSize-1); }
相关文章推荐
- codeforces #304 546 C. Soldier and Cards() (模拟)
- Windows 增强版任务管理器-Process Explorer
- Object-c的继承、封装、多态
- 运算符重载
- Linux访问Windows磁盘实现共享
- 修改cas-server(二),修改认证方式为jdbc。
- 黑马程序员 异常( 格式 体现 总结 ) 包
- 黑马程序员--内部类
- JQuery 提供了两种方式来阻止事件冒泡及区别
- JQuery 提供了两种方式来阻止事件冒泡及区别
- JQuery 提供了两种方式来阻止事件冒泡及区别
- JQuery 提供了两种方式来阻止事件冒泡及区别
- JQuery 提供了两种方式来阻止事件冒泡及区别
- HDU -- 4280 Island Transport(最大流)
- 浅谈sql中的in与not in,exists与not exists的区别
- 避免内存泄露的方法
- Permutation Sequence
- 关于安卓sdk的下载
- 【算法学习笔记】70.回文序列 动态规划 SJTU OJ 1066 小M家的牛们
- GRE写作必备句型