题目:
给你一个整数数组 nums ,请你求出乘积为正数的最长子数组的长度。
一个数组的子数组是由原数组中零个或者更多个连续数字组成的数组。
请你返回乘积为正数的最长子数组长度。
算法:
方法一:贪心
func getMaxLen(nums []int) int {
negtiveCount, postiveCount := 0, 0
firstNegIndex := -1
ans := 0
for i := range nums {
if nums[i] == 0 {
negtiveCount, postiveCount = 0, 0
firstNegIndex = -1
} else if nums[i] > 0 {
postiveCount ++
} else {
if firstNegIndex == -1 {
firstNegIndex = i
}
negtiveCount ++
}
if negtiveCount % 2 == 0 {
ans = max(ans, negtiveCount + postiveCount)
} else {
ans = max(ans, i - firstNegIndex)
}
}
return ans
}
func max(a, b int) int {
if a > b {
return a
}
return b
}
方法二 动态规划
数组negtive[i],和postive保存以i结尾,积为正数,负数的最大连续数组长度。
negtive[i],postive[i]都只和negtive[i - 1],postive[i - 1]有关,具体如下:
- nums[i] > 0
postive[i] = postive[i - 1] + 1
negtive[i] = negtive[i - 1] + 1 (如果negtive[i - 1] >0,即前一个位置存在积为负数的子数组) - nums[i] < 0
postive[i] = negtive[i - 1] + 1 (如果negtive[i - 1] >0,即前一个位置存在积为负数的子数组) negtive[i] = postive[i - 1] + 1 - nums[i] = 0
negtive[i] = 0
postive[i] = 0
func getMaxLen(nums []int) int {
negtiveCount, postiveCount := 0, 0
ans := 0
for i := range nums {
if nums[i] > 0 {
postiveCount ++
// if i > 0 && nums[i - 1] != 0 && negtiveCount > 0 {
// (如果negtive[i - 1] >0,即前一个位置存在积为负数的子数组)
if negtiveCount > 0 {
negtiveCount ++
}
} else if nums[i] < 0 {
tmp := negtiveCount
negtiveCount = postiveCount + 1
// if i > 0 && nums[i - 1] != 0 && tmp > 0 {
// (如果negtive[i - 1] >0,即前一个位置存在积为负数的子数组)
if tmp > 0 {
postiveCount = tmp + 1
} else {
postiveCount = 0
}
} else {
postiveCount = 0
negtiveCount = 0
}
// fmt.Println(nums[i], postiveCount, negtiveCount)
ans = max(ans, postiveCount)
}
return ans
}
func max(a, b int) int {
if a > b {
return a
}
return b
}