LeetCode 1567. 乘积为正数的最长子数组长度
题目描述
思路分析
解法一:动态规划(推荐)
核心思路:
pos表示以当前位置结尾乘积为正的最长长度。neg表示以当前位置结尾乘积为负的最长长度。- 根据当前数正负更新
pos/neg。
复杂度分析:
- 时间复杂度:O(n),其中 n 表示数组长度。
- 空间复杂度:O(1)。
class Solution {
public int getMaxLen(int[] nums) {
int pos = 0;
int neg = 0;
int best = 0;
for (int x : nums) {
if (x > 0) {
pos = pos + 1;
neg = neg == 0 ? 0 : neg + 1;
} else if (x < 0) {
int newPos = neg == 0 ? 0 : neg + 1;
int newNeg = pos + 1;
pos = newPos;
neg = newNeg;
} else {
pos = 0;
neg = 0;
}
best = Math.max(best, pos);
}
return best;
}
}
func getMaxLen(nums []int) int {
pos, neg := 0, 0
best := 0
for _, x := range nums {
if x > 0 {
pos = pos + 1
if neg == 0 {
neg = 0
} else {
neg = neg + 1
}
} else if x < 0 {
newPos := 0
if neg != 0 {
newPos = neg + 1
}
newNeg := pos + 1
pos, neg = newPos, newNeg
} else {
pos, neg = 0, 0
}
if pos > best {
best = pos
}
}
return best
}
相似题目
| 题目 | 难度 | 考察点 |
|---|---|---|
| 1567. 乘积为正数的最长子数组长度 | 中等 | DP |
| 152. 乘积最大子数组 | 中等 | DP |
| 1186. 删除一次得到子数组最大和 | 中等 | DP |
| 53. 最大子数组和 | 简单 | DP |
| 1749. 任意子数组和的绝对值的最大值 | 中等 | 前缀和 |
本博客所有文章除特别声明外,均采用
CC BY-NC-SA 4.0
许可协议,转载请注明出处!