Kadane算法 :
Kadane算法用于解决连续子数组最大和问题 ;
也就是动态规划的一种 ;
总的链接 :
面试经典 150 题 - 学习计划 - 力扣(LeetCode)全球极客挚爱的技术成长平台
53 . 最大子数组和
1 . 贪心 :
从前往后遍历,用cnt表示当前选取连续子序列的和 , 如果遇到cnt<0,那么贪心地置cnt = 0 ,因为负数会让后面地结果更小,在遍历地过程中,更新答案ans = max(ans,cnt) ;
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int cnt = 0;
int ans = INT32_MIN;
for(int i=0;i<nums.size();i++){
cnt += nums[i];
ans = max(ans,cnt);
if(cnt<=0) cnt=0;
}
return ans;
}
};
2 . Dp
dp[i] 表示 在前n个数中的所有连续子数组 ;
首先先预处理dp[i] = nums[i] ;
动态转移方程 : dp[i] = max(dp[i] , dp[i-1] + nums[i])
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int n = nums.size();
int ans=INT_MIN ;
vector<int> dp(n+1,0);
// dp[i] 表示 在前n个数中的所有连续子数组
for(int i=1;i<=n;i++){
dp[i] = max(nums[i-1],dp[i-1]+nums[i-1]);
ans = max(ans,dp[i]);
}
return ans;
}
};
918 . 环形子数组的最大和
转换成最小子序列和即可 :
class Solution {
public:
int maxSubarraySumCircular(vector<int>& nums) {
int sum = 0, ma = nums[0], tma = 0, mi = nums[0], tmi = 0;
for (int& x : nums) {
tma = max(tma+x,x);//最大子序列和
ma = max(ma , tma);
tmi = min(tmi+x,x) ;// 最小子序列和
mi = min(mi,tmi);
sum +=x ;
}
return ma > 0 ? max(ma, sum - mi) : ma;
}
};