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

题目链接:LeetCode 1567. 乘积为正数的最长子数组长度

题意:

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

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

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

 

解题思路:

  使用一个数组 记录 负数的下标, 当数组中的个数为偶数时,代表从 pre位置到当前位置的乘积为正数

当数组中个数为奇数时,那么当前位置减去 数组的第一负数的下标

   直接上代码,注释解释

class Solution {

    /**
     * @param Integer[] $nums
     * @return Integer
     */
    function getMaxLen($nums) {
        $n = count($nums);
        $sum = array();  // 存负数的下标
        $i = 0;
        $ans = 0;
        $pre = -1;
        for($i = 0; $i < $n; $i++) {
            if($nums[$i] == 0) {     
            	$pre = $i; $sum = array(); // 如果遇到0,初始化
            } elseif($nums[$i] < 0) {    // 当前数小于0
            	array_push($sum, $i);    // 否则就将当前数下标插入数组
            }
            if(count($sum) % 2 == 0) {      // 如果它的个数为偶数,那么当前的乘积为正数
            	$ans = max($ans, $i - $pre); 
            } else {
            	$ans = max($ans, $i - $sum[0]); // 当前下标减去第一个负数的下标 
            }
        }
        return $ans;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值