欢迎来到Cefler的博客😁
🕌博客主页:折纸花满衣
🏠个人专栏:题目解析
🌎推荐文章:【LeetCode】winter vacation training
👉🏻 最大子数组和
原题链接:最大子数组和
mycode:
class Solution {
public:
int maxSubArray(vector<int>& nums) {
//dp[i]:以i位置为结尾的元素表示当前连续子数组的最大和
//创建dp表
vector<int> dp(nums.size()+1);
//dp表初始化
dp[0] = 0;
int ret = nums[0];
for(int i = 1;i<dp.size();i++)
{
dp[i] = max(nums[i-1],nums[i-1]+dp[i-1]);
if(dp[i]>ret) ret = dp[i];
}
//返回dp表中的最大值
return ret;
}
};
👉🏻环形子数组的最大和
原题链接:环形子数组的最大和
mycode:
class Solution {
public:
int maxSubarraySumCircular(vector<int>& nums) {
//f[i]:表示第i位置最大子数组之和;g[i]:表示第i位置最小子数组之和
//创建dp表
int n = nums.size();
vector<int> f(n+1),g(n+1);
//初始化dp表
f[0] = g[0] = 0;
//填表
int sum = 0;//记录nums所有元素之和
int max = INT_MIN,min = INT_MAX;
for(int i = 1;i<n+1;i++)
{
f[i] = std::max(nums[i-1],nums[i-1]+f[i-1]);
if(f[i]>max) max = f[i];
g[i] = std::min(nums[i-1],nums[i-1]+g[i-1]);
if(g[i]<min) min = g[i];
sum+=nums[i-1];
}
//返回值
if(sum==min) return max;//说明此时数组中全部都是负数,此时返回数组中最大值即可
return std::max(max,sum-min);
}
};