LeetCode53. Maximum Subarray 动态规划和分治法
来源:互联网 发布:淘宝大学哪个学院好 编辑:程序博客网 时间:2024/06/06 08:13
题意:在一个数组中找到一个和最大的子数组。
(参考了http://www.2cto.com/kf/201403/289418.html)
有两种方法:
- 动态规划DP
- 分治法
动态规划的做法比较简单,代码也更少:
遍历一遍vector,对每个数nums[i],有:
sum=max(sum,nums[i]);max_sum=max(sum,max_sum);
想一下很快就能明白,这样O(n)就能解决。
int maxSubArray(vector<int>& nums) { if(nums.empty()) return 0; int sum=nums[0]; int max=sum; for(int i=1;i<nums.size();++i){ sum=(sum+nums[i])>nums[i]?(sum+nums[i]):nums[i]; max=sum>max?sum:max; } return max; }
分治法:
分治的策略:
将数组均分为两个部分,那么最大子数组会存在于:
- 左侧数组的最大子数组
- 右侧数组的最大子数组
- 左侧数组的以右侧边界为边界的最大子数组+右侧数组的以左侧边界为边界的最大子数组
那么就能很容易的写出分治的代码:
int maxSubArray(vector<int>& nums) { if(nums.size()==0) return 0; if(nums.size()==1) return nums[0]; vector<int> left(nums.begin(),nums.begin()+nums.size()/2); int l=maxSubArray(left); int l_mid=left[left.size()-1]; int l_mid_max=l_mid; for(int i=left.size()-2;i>=0;--i){ l_mid+=left[i]; if(l_mid>l_mid_max) l_mid_max=l_mid; } vector<int> right(nums.begin()+nums.size()/2,nums.end()); int r=maxSubArray(right); int r_mid=right[0]; int r_mid_max=r_mid; for(int i=1;i<right.size();++i){ r_mid+=right[i]; if(r_mid>r_mid_max) r_mid_max=r_mid; } if(l>=r&&l>=(l_mid_max+r_mid_max)) return l; if(r>=l&&r>=(l_mid_max+r_mid_max)) return r; return l_mid_max+r_mid_max; }
0 0
- LeetCode53. Maximum Subarray 动态规划和分治法
- 53. Maximum Subarray-动态规划/分治
- LeetCode53:Maximum Subarray
- [Java]LeetCode53 Maximum Subarray
- Leetcode53 Maximum Subarray
- [leetcode53]Maximum Subarray
- LeetCode53. Maximum Subarray
- Leetcode53: Maximum Subarray
- LeetCode53. Maximum Subarray
- LeetCode53. Maximum Subarray题解
- leetcode53~Maximum Subarray
- leetcode53. Maximum Subarray
- LeetCode53 Maximum Subarray
- LeetCode53. Maximum Subarray
- LeetCode53. Maximum Subarray
- leetcode53. Maximum Subarray
- Leetcode53[easy]--Maximum Subarray
- LeetCode53——Maximum Subarray
- 使用WireShark分析HTTP协议时几种常见的汉字编码
- String和StringBuffer类
- 左移右移的思考
- Service
- 工具使用:git
- LeetCode53. Maximum Subarray 动态规划和分治法
- DSAA Homework 2
- 一些matlab程序的实现
- 算法---二分法
- 浅谈AndroidManifest文件的android:allowBackup属性
- Shell编程遇到的坑
- POJ 1014 Dividing 单调队列优化多重背包
- 2.5.2节练习
- c++中拷贝构造函数的参数类型必须是引用