leetcode-53-Maximum Subarray

原创 2015年07月10日 16:47:29

                                                                      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[n];// 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);
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

leetCode 53.Maximum Subarray (子数组的最大和) 解题思路方法

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

LeetCode(53) Maximum Subarray

题目Find the contiguous subarray within an array (containing at least one number) which has the larges...
  • fly_yr
  • fly_yr
  • 2015年09月05日 20:35
  • 764

leetcode刷题之旅——53. Maximum Subarray

本周写的第二道分治算法的题目,因为上次选择的是一道easy的题目,为了提升自己,这次选择了一道middle难度的题目。虽然这道题目是middle的,但是我还是想了很长时间。其实这道题目可以用动态规划直...

LeetCode 53. Maximum Subarray(dynamic programming)

题目链接:https://leetcode.com/problems/maximum-subarray/ 题目描述: Find the contiguous subarray within an ...

[LeetCode]53.Maximum Subarray

【题目】 Find the contiguous subarray within an array (containing at least one number) which has the l...

53.Maximum Subarray | LeetCode 解题思路

本题来源于LeetCode devide and conquer题库,难度easy。

Leetcode53 Maximum Subarray

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

Leetcode题解 - 53. Maximum Subarray

Find the contiguous subarray within an array (containing at least one number) which has the largest ...

[LeetCode] 53. Maximum Subarray

[LeetCode] 53. Maximum Subarray(Medium) 分治算法实践
  • zhao_tw
  • zhao_tw
  • 2016年09月20日 21:21
  • 112

leetcode-53:Maximum Subarray

声明: 1、本文仅为学习笔记,不得商用 2、文中所引文献,已在参考资料中说明,但部分来源于网络,出处无可考究,如果文中引用了您的原创,请您私信我 3、如果内容有错误或者不准确的地方请大家指...
  • supinyu
  • supinyu
  • 2016年07月22日 00:26
  • 246
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:leetcode-53-Maximum Subarray
举报原因:
原因补充:

(最多只允许输入30个字)