53.最大子数组和

53.最大子数组和
暴力解法,枚举左右端点。

#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;
vector<string> finalPath;
int maxSubArray(vector<int>& nums) {
	// 暴力解 O(n^3)=枚举左端点+枚举右端点+求左端点到右端点的和sum
	// 但对左端点到右端点求和,这一步可以简化为O(1),
	// 因为在确定了左端点的前提下,枚举右端点,sum每次加一个右端点元素即可
	int maxSum = -10e6;
	int startIndex = 0, endIndex = 0;
	for (int left = 0; left < nums.size(); left++) {
		int temp = 0;
		for (int right = left; right < nums.size(); right++) {
			temp += nums[right];
			if (maxSum < temp) {
				maxSum = temp;
				startIndex = left;
				endIndex = right;
			}
		}
	}
	//此时startIndex和endIndex存放着该子数组的下标,如有需要则可以输出
	return maxSum;
}
int main() {
	vector<int> nums = {-2, 1, -3, 4, -1, 2, 1, -5, 4};
    maxSubArray(nums);
	return 0;
}

动态规划法:f[i]表示以i为结尾的数组的子数组的和的最大值。说明i这个元素必选。

转移方程为:
if(f[i-1]>0)f[i]=f[i-1]+nums[i];
else f[i]=nums[i];

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        vector<int> f(nums.size());
        f[0]=nums[0];
        int max=nums[0];
        for(int i=1;i<nums.size();i++){
            if(f[i-1]<0)f[i]=nums[i];
            else{
                f[i]=f[i-1]+nums[i];
            }
            if(max<f[i])max=f[i];
        }
        
        return max;
    }
};
posted @ 2025-03-21 22:28  Cheauncey  阅读(25)  评论(0)    收藏  举报