# 题目描述
# 思路和题解
哈哈哈,这类型题感觉已经渐渐找到诀窍了,实际上就是要分情况讨论,乘积为正数的最长子数组,可以分为若当前 i 是正数,那就要找 i-1 乘积为正数的最大长度;若当前 i 为负数,那就要找 i-1 乘积为负数的最大长度。所以我们就要维护两个数组~~
虽然我已经解出这道题了,但维护两个数组应该还可以再优化一下,和前面的题类型,应该能用滚动数组将空间复杂度从 O (n) 优化到 O (1),但最近要在外面出差有点忙,所以只能放到以后再优化了,后面的题也只能抽时间再刷~
class Solution { | |
public: | |
int getMaxLen(vector<int>& nums) { | |
int n = nums.size(); | |
int len = 0; | |
vector<int> pos(n), neg(n); | |
if (nums[0] > 0) pos[0] = 1; | |
else if (nums[0] < 0) neg[0] = 1; | |
for (int i = 1; i < n; ++i) { | |
if (nums[i] > 0) { | |
if (neg[i-1] > 0) neg[i] = neg[i-1] + 1; | |
pos[i] = pos[i-1] + 1; | |
} | |
else if (nums[i] < 0) { | |
neg[i] = pos[i-1] + 1; | |
if (neg[i-1] > 0) pos[i] = neg[i-1] + 1; | |
} | |
} | |
return *max_element(pos.begin(), pos.end()); | |
} | |
}; |