LeetCode DP(2)

LeetCode  T1567.乘积为正数的最长子数组

  

  与T152乘积最大子数组有异曲同工之妙🤣

 

题目描述:

给你一个整数数组 nums ,请你求出乘积为正数的最长子数组的长度。

一个数组的子数组是由原数组中零个或者更多个连续数字组成的数组。

请你返回乘积为正数的最长子数组长度。

 

实例1:

输入:nums = [1,-2,-3,4]
输出:4
解释:数组本身乘积就是正数,值为 24

 

实例2:

输入:nums = [0,1,-2,-3,-4]
输出:3
解释:最长乘积为正数的子数组为 [1,-2,-3] ,乘积为 6注意,我们不能把 0 也包括到子数组中,因为这样乘积为 0 ,不是正数。

 

思路:

求最大乘积,那就贪心,硬贪,遍历数组每一元素n:

n == 0 正负数统计清零

n > 0 正数累加 如果前面有负数 负数也累加

n < 0 乘后变号 所以正负数累加交换 负数累加 有正数也累加

 

每次非零数都贪!最大正数统计长度。

 

 

代码:

class Solution {
public:
    int getMaxLen(vector<int>& nums) {
        int ans = 0, z = 0, f = 0;
        for(int n: nums){
            if(n == 0){
                z = 0;
                f = 0;
            }
            else if(n > 0){
                z++;
                if(f > 0){
                    f++;
                }
            ans = max(ans, z); 
            }
            else{
                swap(z, f);
                f++;
                if(z > 0){
                    z++;
                }
            ans = max(ans, z);
            }
        }
        return ans;
    }
};

 

posted @ 2021-12-31 21:25  HM-7  阅读(40)  评论(0)    收藏  举报