53.Maximum Subarray | LeetCode 解题思路

来源:互联网 发布:妮维雅唇膏 知乎 编辑:程序博客网 时间:2024/05/16 10:19

题目描述

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
原创粉丝点击