题目描述:
给你一个整数数组 nums
,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组 是数组中的一个连续部分。
示例 1:
输入:nums = [-2,1,-3,4,-1,2,1,-5,4] 输出:6 解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
示例 2:
输入:nums = [1] 输出:1
1.动态规划方法
用 f ( i ) 来表示第i个数为起始,第j个数为末尾的「连续子数组的最大和」
状态转移方程为:f ( i ) = max { f ( i−1 ) + nums[i] , nums[i] }
创建dp数组,用来存储每一个f ( i )
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int n=nums.size();
if(n==1) return nums[0];
int L=2;
int max=nums[0];
vector<vector<int>> dp(n,vector<int>(n));
for(int i=0;i<n;i++){
dp[i][i]=nums[i];
if(nums[i]>max)
max=nums[i];
}
for(;L<=n;L++){
for(int i=0;i<n;i++){
int j=i+L-1;
if(j>=n) break;
if(L==2) {
dp[i][j]=nums[i]+nums[j];
}else {
dp[i][j]=nums[i]+nums[j]+dp[i+1][j-1];
}
if(dp[i][j]>max){
max=dp[i][j];
}
}
}
return max;
}
};
2.贪心算法(官方方法)
从第一个数字开始,设数字nums[ i ]前的子数组和为 pre
如果 pre 小于零,则不相加,如果大于零,则与nums[ i ]相加
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int pre = 0, maxAns = nums[0];
for (const auto &x: nums) {
pre = max(pre + x, x);
maxAns = max(maxAns, pre);
}
return maxAns;
}
};
来源:力扣官方答案