zoukankan      html  css  js  c++  java
  • 1567. 乘积为正数的最长子数组长度 dp

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

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

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

    示例  1:

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

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/maximum-length-of-subarray-with-positive-product
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    思路:递归,
    dp[i][0] : 乘积为负的最长子数组的长度
    dp[i][1] : 乘积为正的最长子数组的长度
    遍历数组中的数字,对于每个数字,根据其>0,=0,<0进行不同处理

    class Solution {
    public:
        int getMaxLen(vector<int>& nums) {
            int dp[100005][2];
    
            // dp[i][0] : 乘积为负的最长子数组的长度
            // dp[i][1] : 乘积为正的最长子数组的长度
            int ans = 0;
    
            dp[0][0] = dp[0][1] = 0;
            for (int i = 1; i <= nums.size(); i++) {
                if (nums[i - 1] == 0) {
                    dp[i][0] = dp[i][1] = 0;
                }
                else
                if (nums[i - 1] > 0) {
                    dp[i][1] = dp[i -1][1] + 1;
                    dp[i][0] = dp[i - 1][0] ? (dp[i - 1][0] + 1) : 0;
                }
                else
                if (nums[i - 1] < 0) {
                    dp[i][0] = dp[i - 1][1] + 1;
                    dp[i][1] = dp[i - 1][0] ? (dp[i - 1][0] + 1) : 0;
                }
                ans = max(ans, dp[i][1]);
            }
    
            return ans;
        }
    };
    
  • 相关阅读:
    uva 1637 Double Patience
    Emacs ^ Vim
    uva 11181 Probability|Given
    uva 10491 Cows and Cars
    uva 1636 Headshot
    hdu 4336 Card Collector
    zoj 3640 Help Me Escape
    Codeforces 148 D Bag of mice
    hdu 4405 Aeroplane chess
    hdu 3853 LOOPS
  • 原文地址:https://www.cnblogs.com/xgbt/p/13625179.html
Copyright © 2011-2022 走看看