53.Maximum Subarray | LeetCode 解题思路

题目描述

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.
Difficulty : Easy

题目解读

题目要求找到相加和最大的连续子数列,一开始看这道题很像找出某函数积分值最大的连续区间。所以设置一个变量largest,时刻记录当前元素总和最大值的情况。
另一个变量sum记录所有元素总和,当总和变负时将sum清零,重新开始计算。
代码如下:

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int size = nums.size();
        int largest = nums[0];
        int sum = 0;
        for(int i = 0; i < size; i++){
            sum += nums[i];
            if(sum > largest) largest = sum;
            if(sum < 0) sum = 0;
        }
        return largest;
    }
};

如果用到分治思想的话,考虑将数组分为左右两个部分,累加和最大的子数列可能出现在左边或者右边,或者中间部分。因此需要逐步计算出含最左元素的子列最大和,含最右元素的最大子列和,以及中间子列的最大和。最后将结果汇总。

class Solution {
public:
    void findmax(vector<int>& nums, int l, int r, int &maxx, int &lm, int &rm, int &sum){
        if(l == r) lm = rm = sum = maxx = nums[l];
        else{
            int mid = (l + r) / 2;
            int lmax, rmax, llm, lrm, rlm, rrm, lsum, rsum;
            findmax(nums, l, mid, lmax, llm, lrm, lsum);
            findmax(nums, mid + 1, r, rmax, rlm, rrm, rsum);
            maxx = max(max(lmax, rmax), lrm + rlm);
            lm = max(llm, lsum + rlm);
            rm = max(rrm, rsum + lrm);
            sum = lsum + rsum;
        }
    }
    int maxSubArray(vector<int>& nums) {
        if(nums.size() == 0) return 0;
        else{
        int max, lm, rm, sum;
        findmax(nums, 0, nums.size() - 1, max, lm, rm, sum);
        return max;
        }
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值