这道题还是有点绕,尤其是当nums[i]<0时的处理逻辑,需要特别注意,因为这里需要涉及一个将counte2的值赋给counte1。
package likou;
/*
* 乘积为正数的最长子数组长度
* 题干:
* 给你一个整数数组nums,请你求出乘积为正数的最长子数组的长度
* 一个数组的子数组是由原数组中零个或者更多个连续数字组成的数组
* 请你返回乘积为正数的最长子数组长度
*/
public class Demo1567 {
/*
* 解题思路:
* 要求的时乘积为正数的最长子数组的长度,则要求数组尽可能的长
* 结果为整数,则可能遍历到i元素时,i可能为正也可能为负
* 因此需要记录遍历到i-1个元素时,不管积时正数还是负数都要记录最大长度
*/
public int getMaxLen(int[] nums) {
int count1 = nums[0]>0?1:0;//积为整数最大长度
int count2 = nums[0]<0?1:0;//积为负数最大长度
int value = count1;//最大长度
int length = nums.length;
for(int i=1;i<length;i++) {
int temp = nums[i];
//1,2,-2,6,-3,0,4
if(temp > 0) {
count1++;
if(count2 > 0) {
count2++;
}
}else if(temp<0) {
int newCount1 = count2>0?count2+1:0;
int newCount2 = count1+1;
count1 = newCount1;
count2 = newCount2;
}else {
count1 = 0;
count2 = 0;
}
value = Math.max(value, count1);
}
return value;
}
public static void main(String args[]) {
Demo1567 demo = new Demo1567();
int[] nums = {1,2,3,5,-6,4,0,10};
System.out.println(demo.getMaxLen(nums));
}
}