一、题目说明

题目是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.

刷题53. Maximum Subarray的更多相关文章

  1. LeetCode练题——53. Maximum Subarray

    1.题目 53. Maximum Subarray——Easy Given an integer array nums, find the contiguous subarray (containin ...

  2. go语言刷leetcode - 53 Maximum Subarray

    package main import ( "fmt" "math" ) func maxSubArray(nums []int) int { var larg ...

  3. 41. leetcode 53. Maximum Subarray

    53. Maximum Subarray Find the contiguous subarray within an array (containing at least one number) w ...

  4. Leetcode#53.Maximum Subarray(最大子序和)

    题目描述 给定一个序列(至少含有 1 个数),从该序列中寻找一个连续的子序列,使得子序列的和最大. 例如,给定序列 [-2,1,-3,4,-1,2,1,-5,4], 连续子序列 [4,-1,2,1] ...

  5. 小旭讲解 LeetCode 53. Maximum Subarray 动态规划 分治策略

    原题 Given an integer array nums, find the contiguous subarray (containing at least one number) which ...

  6. Leetcode之53. Maximum Subarray Easy

    Leetcode 53 Maximum Subarray Easyhttps://leetcode.com/problems/maximum-subarray/Given an integer arr ...

  7. [Leetcode][Python]53: Maximum Subarray

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 53: Maximum Subarrayhttps://leetcode.co ...

  8. 53. Maximum Subarray【leetcode】

    53. Maximum Subarray[leetcode] Find the contiguous subarray within an array (containing at least one ...

  9. [array] leetcode - 53. Maximum Subarray - Easy

    leetcode - 53. Maximum Subarray - Easy descrition Find the contiguous subarray within an array (cont ...

随机推荐

  1. JavaScript - jQuery注意点

    jQuery统一了不同浏览器之间的DOM操作的差异 1. jQuery === $ // true 1.1 $(x) //将x转换为jQuery对象,便于调用jQuery提供的API 1.2 方便操作 ...

  2. 面试官:说说Spring中的事务传播行为

    前言 在开发中,相信大家都使用过Spring的事务管理功能.那么,你是否有了解过,Spring的事务传播行为呢? Spring中,有7种类型的事务传播行为.事务传播行为是Spring框架提供的一种事务 ...

  3. ssh访问ubuntu13.10

    步骤: 首先确保网络连接是ok,网络连接方式"桥接“,手动配置 ip 192.168.1.9,和主机是同一网段 1.检查当前有没有安装openssh-server(已安装) 2. 安装ope ...

  4. Struts笔记一

    Struts 概念: 是一个MVC框架: Servlet的缺点 1.在web.xml中文件中需要配置很多行代码,维护起来很不方便呢,不利于团队合作. 2.一个servlet的入口只有一个doPost或 ...

  5. MySql向SQLServer迁移常见问题

    -- MySql与SQLServer update inner join语法区别-- MySql: UPDATE A LEFT JOIN B ON A.B_ID = B.B_ID SET A.A_NA ...

  6. 布线问题&魔法花园_最短路径

    布线问题 问题描述:印刷电路板将布线区域划分成n×m个方格阵列,精确的电路布线问题要求确定连接方格a到方格b的最短布线方案:布线时,电路只能沿着直线或直角(方格)布线:已经布线的方格被锁定,即不允许其 ...

  7. python学习 —— seaborn、matplotlib、pandas、numpy package的混合使用

    这里使用了Titanic Machine learning数据集,然后通过Seaborn的函数来拟合和绘制回归线,matplotlib进行可视化. 先来一个简单的测试: import pandas a ...

  8. matlab学习 — 实现简单的爬虫

    这里复杂的情况暂时不考虑..测试网址为pixiv的每日排行榜 = = url = 'https://www.pixiv.net/ranking.php?mode=daily' text = webre ...

  9. 学习Flutter应用开发有用的代码/库/专有技术列表

    当我开始使用Flutter开发该应用程序时,我开始担心:“最好的书写方式是什么?”以及“放置它的效果如何?”在这种情况下,您将需要学习和参考GitHub发布的代码和应用程​​序. 因此,我收集了似乎对 ...

  10. win10安装Oracle11g

    第一步,下载 oracle 下载地址,官网(需要登录注册): http://download.oracle.com/otn/nt/oracle11g/112010/win64_11gR2_databa ...