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;
}
};

浙公网安备 33010602011771号