一、题目说明

题目是53. Maximum Subarray,求最长连续子序列最大和。难度是Easy!

二、我的解答

Easy的题目,居然没做出来。

后来看了用dp方法,其中dp[i]表示以第i个元素结尾的最大和。

dp[i] = nums[i] > nums[i]+dp[i-1] ? nums[i] : nums[i]+dp[i-1];

然后求出最大的dp即可。知道思路,实现非常简单,问题是没有往动态规划上面去想。

#include<iostream>
#include<vector> using namespace std;
class Solution{
public:
int maxSubArray(vector<int>& nums) {
int len=nums.size();
vector<int> dp;
dp.resize(len);
//以第i个元素结尾的最大和
dp[0] = nums[0];
int max = dp[0];
for(int i=1;i<len;i++){
dp[i] = nums[i] > nums[i]+dp[i-1] ? nums[i] : nums[i]+dp[i-1];
max = max > dp[i] ? max : dp[i];
} return max;
}
};
int main(){
Solution s; vector<int> m;
m = {-2,1,-3,4,-1,2,1,-5,4};
cout<<(6==s.maxSubArray(m))<<"\n"; m = {-2,1,-3};
cout<<(1==s.maxSubArray(m))<<"\n"; m = {1};
cout<<(1==s.maxSubArray(m))<<"\n"; m = {-2,-1};
cout<<(-1==s.maxSubArray(m))<<"\n";
return 0;
}

性能居然还不错,空间复杂的可以优化,dp复用nums,还是算了,可读性不好:

Runtime: 4 ms, faster than 98.55% of C++ online submissions for Maximum Subarray.
Memory Usage: 9.4 MB, less than 17.65% of C++ online submissions for Maximum Subarray.

三、优化

题目说让用分治算法,分而治之。我想想,应该是类似“二分查找”。不会,看了大神的实现:

class Solution{
public:
//divide & conquer approach
int maxSubArray(vector<int>& nums) {
return maxSubArrayPart(nums,0,nums.size()-1);
}
private:
int maxSubArrayPart(vector<int>& nums,int left,int right){
if(left==right){
return nums[left];
}
int mid = (left+right) / 2;
return max(maxSubArrayPart(nums,left,mid),
max(maxSubArrayPart(nums,mid+1,right),maxSubArrayAll(nums,left,mid,right)));
} //左右两边求和
int maxSubArrayAll(vector<int>& nums,int left,int mid,int right){
int leftSum = INT_MIN;
int sum=0;
for(int i=mid;i>=left;i--){
sum += nums[i];
if(sum>leftSum) leftSum=sum;
} sum=0;
int rightSum= INT_MIN;
for(int i=mid+1;i<=right;i++){
sum += nums[i];
if(sum>rightSum) rightSum=sum;
} return leftSum+rightSum;
}
};

性能:

Runtime: 8 ms, faster than 74.25% of C++ online submissions for Maximum Subarray.
Memory Usage: 9.4 MB, less than 33.33% of C++ online submissions for Maximum Subarray.

最新文章

  1. Android 手机卫士--绑定sim卡序列号
  2. XSS之xssprotect(转)
  3. N个数依次入栈,出栈顺序有多少种?
  4. codeforces 446C DZY Loves Fibonacci Numbers(数学 or 数论+线段树)(两种方法)
  5. leetcode 123. Best Time to Buy and Sell Stock III ----- java
  6. C# 高精度减法 支持小数(待优化)
  7. 软件测试 homework2
  8. Ridge Regression and Ridge Regression Kernel
  9. JS_高阶函数(sort)
  10. 转:C#中Undo/Redo的一个简易实现
  11. java爬虫框架webmagic学习(一)
  12. .15-浅析webpack源码之WebpackOptionsApply模块-plugin事件流总览
  13. Graphviz
  14. arcgis api for js 之发布要素服务
  15. [Robot Framework] Robot Framework用Execute Javascript对XPath表示的元素执行scrollIntoView操作
  16. Prometheus Node_exporter 之 Network Netstat UDP
  17. BZOJ2458 Beijing2011最小三角形(分治)
  18. Find–atime –ctime –mtime的用法与区别总结
  19. Sony/索尼 NW-ZX300A ZX300 无损音乐播放器4.4口
  20. qt linux下配置安装

热门文章

  1. MD5 加密解密字符串
  2. python合并大量ts文件成mp4格式(ps:上限是450,亲测)
  3. postman使用get请求的url地址传参中文乱码问题
  4. Apache+Php+Mysql配置
  5. 06. Z字型变换
  6. Linux 添加新磁盘 &amp;&amp; 创建分区 &amp;&amp; 挂载
  7. Genymotion设置代理至BurpSuite和Charles
  8. 一文解读CDN (转)
  9. Python学习笔记之正则表达式
  10. 四 SpringMVC与页面之间的参数传递&amp;高级参数的绑定&amp;日期类型的转换