算法题汇总链接
题目链接
给你一个整数数组 nums ,请你求出乘积为正数的最长子数组的长度。
一个数组的子数组是由原数组中零个或者更多个连续数字组成的数组。
请你返回乘积为正数的最长子数组长度。
在写代码前,务必先做好这五步!梳理清楚思路,写代码只是顺手的事儿,这是第一道题,所以会详细描述分析方法,后面的题也是同一个流程~
代码如下:
class Solution {
public:
int getMaxLen(vector<int>& nums) {
// 1. 创建 dp 表
int n = nums.size();
vector<int> f(n + 1); // 乘积为正数的最长数
auto g = f; // 乘积为负数的最长数
// 2. 初始化
int fmax = 0;
f[0] = g[0] = 0;
// 3. 誊写状态转移方式
for(int i = 1; i < n + 1; i++)
{
if(nums[i - 1] > 0)
{
f[i] = f[i-1] + 1;
g[i] = g[i-1] == 0 ? 0 : g[i-1] + 1;
}
else if(nums[i - 1] < 0)
{
f[i] = g[i-1] == 0 ? 0 : g[i-1] + 1;
g[i] = f[i-1] + 1;
}
fmax = max(fmax, f[i]);
}
// 4. 返回值
return fmax;
}
};
如果本文对你有些帮助,欢迎 点赞 收藏 关注,你的支持是对作者大大莫大的鼓励!!(✿◡‿◡) 若有差错恳请留言指正~~