# 题目描述

# 思路和题解

哈哈哈,这类型题感觉已经渐渐找到诀窍了,实际上就是要分情况讨论,乘积为正数的最长子数组,可以分为若当前 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());
    }
};
更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

宇凌喵 微信支付

微信支付

宇凌喵 支付宝

支付宝