题目链接: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;
}
}