文章目录
- 一、53. 最大子数组和
- 1.题目简介
- 2.解题思路
- 3.代码
- 4.运行结果
- 二、918. 环形子数组的最大和
- 1.题目简介
- 2.解题思路
- 3.代码
- 4.运行结果
- 三、152. 乘积最大子数组
- 1.题目简介
- 2.解题思路
- 3.代码
- 4.运行结果
- 总结
一、53. 最大子数组和
1.题目简介
53. 最大子数组和
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组是数组中的一个连续部分。
2.解题思路
3.代码
class Solution {
public:
int maxSubArray(vector<int>& nums) {
//以i元素为结尾的连续数组的最大和
vector<int> dp(nums.size(), 0);
int ret = nums[0];
dp[0] = nums[0];
for(int i = 1;i < nums.size(); ++i)
{
dp[i] = max(nums[i], dp[i - 1] + nums[i]);
ret = max(ret, dp[i]);
}
return ret;
}
};
4.运行结果
二、918. 环形子数组的最大和
1.题目简介
918. 环形子数组的最大和
给定一个长度为 n 的环形整数数组 nums ,返回 nums 的非空 子数组 的最大可能和 。
环形数组 意味着数组的末端将会与开头相连呈环状。形式上, nums[i] 的下一个元素是 nums[(i + 1) % n] , nums[i] 的前一个元素是 nums[(i - 1 + n) % n] 。
子数组 最多只能包含固定缓冲区 nums 中的每个元素一次。形式上,对于子数组 nums[i], nums[i + 1], …, nums[j] ,不存在 i <= k1, k2 <= j 其中 k1 % n == k2 % n 。
2.解题思路
3.代码
class Solution {
public:
int maxSubarraySumCircular(vector<int>& nums) {
vector<int> f(nums.size(), 0);//以i元素为结尾的连续数组的最大和
vector<int> g(nums.size(), 0);//以i元素为结尾的连续数组的最小和
int flag = 1;//假设全为负数
int fmax = nums[0], gmin = nums[0];
f[0] = g[0] = nums[0];
int sum = nums[0];
for(int i = 1;i < nums.size(); ++i)//最大和
{
if(nums[i] > 0) flag = 0;
f[i] = max(nums[i], f[i - 1] + nums[i]);
fmax = max(fmax, f[i]);
g[i] = min(nums[i], g[i - 1] + nums[i]);
gmin = min(gmin, g[i]);
sum += nums[i];
}
if(flag) return fmax;
return max(fmax, sum - gmin);
}
};
4.运行结果
三、152. 乘积最大子数组
1.题目简介
152. 乘积最大子数组
给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。
测试用例的答案是一个 32-位 整数。
子数组 是数组的连续子序列。
2.解题思路
3.代码
class Solution {
public:
int maxProduct(vector<int>& nums) {
vector<int> f(nums.size(), 0);
vector<int> g(nums.size(), 0);
f[0] = nums[0], g[0] = nums[0];
int ret = nums[0];
for(int i = 1;i < nums.size(); ++i)
{
if(nums[i] > 0)
{
f[i] = max(nums[i], f[i - 1] * nums[i]);
g[i] = min(nums[i], g[i - 1] * nums[i]);
}
else if(nums[i] < 0)
{
f[i] = max(nums[i], g[i - 1] * nums[i]);
g[i] = min(nums[i], f[i - 1] * nums[i]);
}
else
{
f[i] = 0;
g[i] = 0;
}
ret = max(ret, f[i]);
}
return ret;
}
};
4.运行结果
总结
今天是算法练习的第6天。
有志者事竟成,继续加油。
如果本篇文章对你有所启发的话,希望可以多多支持作者,谢谢大家!