[leetcode]Maximum Subarray
2015-10-09 14:34
246 查看
SubArray是连续的
class Solution {//分治,时间复杂度O(nlogn) public: int maxSubArray(vector<int>& nums) { int n=nums.size(); return maxSubArray2(&nums[0],n);//vector转数组 } int maxSubArray2(int A[],int n){ if(n==1){//递归终止条件 return A[0]; } int mid=n>>1; //0..mid-1 //mid..n-1 int answer=max(maxSubArray2(A,mid),maxSubArray2(A+mid,n-mid)); int now=A[mid-1],may=now; for(int i=mid-2;i>=0;--i){//向左扫描 may=max(may,now+=A[i]); } now=may; for(int j=mid;j<n;++j){//向右扫描 may=max(may,now+=A[j]); } return max(answer,may); } };
class Solution {//DP,时间复杂度O(n),空间复杂度O(n) public: int maxSubArray(vector<int>& nums) { int n=nums.size(); vector<int> dp(n); dp[0]=nums[0]; int answer=dp[0]; for(int i=1;i<n;++i){ dp[i]=max(dp[i-1]+nums[i],nums[i]); answer=max(dp[i],answer); } return answer;} };
class Solution {//DP,时间复杂度O(n),空间复杂度O(1) public: int maxSubArray(vector<int>& nums) { int n=nums.size(); int endHere=nums[0]; int answer=nums[0]; for(int i=1;i<n;++i){ endHere=max(endHere+nums[i],nums[i]); answer=max(endHere,answer); } return answer; } };
class Solution {//线性算法,通过sum求解 public: int maxSubArray(vector<int>& nums) { int n=nums.size(); int sum=nums[0]; int minSum=min(0,sum);//所有sum的最小值 int answer=nums[0]; for(int i=1;i<n;++i){ sum+=nums[i];//前i项的和 answer=max(answer,sum-minSum);//结果 minSum=min(minSum,sum);//更新minSum } return answer; } };
相关文章推荐
- Saltstack安装
- C#编码规范
- javascript格式化日期格式
- 【翻译】了解ASP.NET MVC的HTML助手
- ThinkPHP让../Public在模板不解析(直接输出)的方法[原创]_php实例_脚本之家
- java反射详解
- golang开发环境mac下编译linux环境文件
- 淘宝MetaQ开源消息队列安装
- PHP异步执行技巧
- jsp,servlet,javascript,xml,html之间的关系
- 检验Xcode是否被改动过的简单方法,不妨试试!!!
- android从服务器端解析json数据
- Saltstack
- Xamarin 设置ListView组头的高度
- POJ 3320 Jessica's Reading Problem (原来标题在这里改……)
- linux下c程序进程地址空间分布
- ios开发系列之对象的序列化与反序列化
- Microsoft Enterprise Library
- 求一个数的二进制数中1的个数
- ADB工具介绍(Android Debug Bridge),摘选重点翻译,请随便喷