leetcode53 最大子数组和(前缀和解法)

题目描述:
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组 是数组中的一个连续部分。
示例:
输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
算法思想:前缀和+前缀最小值

求出前缀和数组S,枚举右端点i,找到i之前的一个j使得 S[i] - S[j]最大,就是让S[j]最小,所以可以维护一个S的前缀最小值。

c++代码实现:
class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int n = nums.size();
        vector<int> sum(n + 1, 0);
        // 处理前缀和数组sum
        for(int i = 1; i <= n; i++) sum[i] = sum[i-1] + nums[i-1];
        // 记录前缀最小值
        int premin = sum[0];
        int ans = INT_MIN;
        for(int i = 1; i <= n; i++){
            // 枚举右端点i,找到i之前的一个j使得s[i] - s[j]最大,即让s[j]最小,所以使用premin保存i之前的前缀最小值
            ans = max(ans, sum[i] - premin); // 更新最大连续子数组的和。
            premin = min(premin, sum[i]); // 更新至i的前缀最小值
        }
        return ans;
    }
};
时间复杂度:

O(n)

你可能感兴趣的:(leetcode题解,算法,leetcode,数据结构)