1567. 乘积为正数的最长子数组长度 #
- 标签:贪心、数组、动态规划
- 难度:中等
题目大意 #
给定一个整数数组 nums
。
要求:求出乘积为正数的最长子数组的长度。
- 子数组:是由原数组中零个或者更多个连续数字组成的数组。
解题思路 #
使用动态规划来做。使用数组 pos
表示以下标 i
结尾的乘积为正数的最长子数组长度。使用数组 neg
表示以下标 i
结尾的乘积为负数的最长子数组长度。
-
先初始化
pos[0]
、neg[0]
。- 如果
nums[0] == 0
,则pos[0] = 0, neg[0] = 0
。 - 如果
nums[0] > 0
,则pos[0] = 1, neg[0] = 0
。 - 如果
nums[0] < 0
,则pos[0] = 0, neg[0] = 1
。
- 如果
-
然后从下标
1
开始递推遍历数组nums
,对于nums[i - 1]
和nums[i]
:-
如果
nums[i - 1] == 0
,显然有pos[i] = 0
,neg[i] = 0
。表示:以i
结尾的乘积为正数的最长子数组长度为0
,以i
结尾的乘积为负数数的最长子数组长度也为0
。 -
如果
nums[i - 1] > 0
,则pos[i] = pos[i - 1] + 1
。而neg[i]
需要进行判断,如果neg[i - 1] > 0
,则再乘以当前nums[i]
后仍为负数,此时长度 +1,即neg[i] = neg[i - 1] + 1
。而如果neg[i - 1] == 0
,则neg[i] = 0
。 -
如果
nums[i - 1] < 0
,则pos[i]
需要进行判断,如果neg[i - 1] > 0
,再乘以当前nums[i]
后变为正数,此时长度 +1,即pos[i] = neg[i - 1] + 1
。而如果neg[i - 1] = 0
,则pos[i] = 0
。 -
更新
ans
答案为pos[i]
最大值。
-
-
最后输出答案
ans
。
代码 #
|
|