[LeetCode]53. Maximum Subarray 解题报告(C++)

[LeetCode]53. Maximum Subarray 解题报告(C++)

题目描述

Given an integer array nums, find the contiguous subarray (containing at least one number) which has the largest sum and return its sum.

Example:

Input: [-2,1,-3,4,-1,2,1,-5,4],
Output: 6
Explanation: [4,-1,2,1] has the largest sum = 6.

Follow up:

If you have figured out the O(n) solution, try coding another solution using the divide and conquer approach, which is more subtle.

题目大意

  • 给定一个数组,找到连续子串使得子串和最大.
  • 要求O(n)
  • 尝试分治算法!!!

解题思路

方法1:

  • 要记录前面的和与当前值之和,比起当前值.谁大.
  • 将大的赋给 cursum
  • 然后就要将 res和cursum比较做更新.

代码实现:

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int res = INT_MIN;
        int cursum = 0;
        for (auto x : nums) {
            /*
            在这里抉择是否重新开始
            比较 前面的和加了x 和 x自身
            */
            cursum = max(cursum+x,x);   
            // 更新
            res = max(res, cursum);
        }
        return res;
    }
};

方法2:

  • 分治算法 O(NlogN)
  • 将数组一分为二.分别找出左边和右边的最大子数组之和.
  • 然后还要从中间向两边分别扫描.求出最大值分别和两边的最大值比较取最大.

代码实现:

class Solution {
public:
    int maxSubArray(vector<int>& nums) {

        if (nums.empty()) {
            return 0;
        }
        return helper(nums, 0, (int)nums.size() - 1);
    }

    int helper(vector<int> &nums, int l, int r) {
        if (l >= r) {
            return nums[l];
        }
        int mid = l + (r - l) / 2;
        int lmax = helper(nums, l, mid-1);
        int rmax = helper(nums, mid + 1, r);
        int mmax = nums[mid]; 
        int tmp = mmax;
        for (int i = mid - 1; i >= l; i--) {
            tmp += nums[i];
            mmax = max(mmax, tmp);
        }
        tmp = mmax;
        for (int i = mid + 1; i <= r; i++) {
            tmp += nums[i];
            mmax = max(mmax, tmp);
        }
        return max(lmax, max(rmax, mmax));
    }
};

方法3:

代码实现:

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int n = nums.size();
        if (n < 1) return 0;
        int *dp = new int[n];
        dp[0] = nums[0];
        int res = dp[0];
        for (int i = 1; i < n; i++) {
            dp[i] = (dp[i - 1] > 0 ? dp[i - 1] + nums[i]:nums[i]);
            res = max(dp[i], res);
        }
        return res;
    }
};

小结

    -

猜你喜欢

转载自blog.csdn.net/qjh5606/article/details/81411441