时间:2020-8-31
题目地址:https://leetcode-cn.com/problems/maximum-length-of-subarray-with-positive-product/
题目难度:Medium
题目描述:
给你一个整数数组 nums ,请你求出乘积为正数的最长子数组的长度。
一个数组的子数组是由原数组中零个或者更多个连续数字组成的数组。
请你返回乘积为正数的最长子数组长度。
示例 1:
输入:nums = [1,-2,-3,4]
输出:4
解释:数组本身乘积就是正数,值为 24 。
示例 2:
输入:nums = [0,1,-2,-3,-4]
输出:3
解释:最长乘积为正数的子数组为 [1,-2,-3] ,乘积为 6 。
注意,我们不能把 0 也包括到子数组中,因为这样乘积为 0 ,不是正数。
示例 3:
输入:nums = [-1,-2,-3,0,1]
输出:2
解释:乘积为正数的最长子数组是 [-1,-2] 或者 [-2,-3] 。
示例 4:
输入:nums = [-1,2]
输出:1
示例 5:
输入:nums = [1,2,3,5,-6,4,0,10]
输出:4
提示:
1 <= nums.length <= 10^5
-10^9 <= nums[i] <= 10^9
思路1:周赛的第二道题,结束了都还在调,最终也没过去,超时了
大佬写的双百
代码段1:通过
class Solution:
def getMaxLen(self, nums: List[int]) -> int:
res = 0
neg_found, first_neg, first_zero = 0, float('inf'), -1
for i, num in enumerate(nums):
if num == 0:
neg_found, first_neg, first_zero = 0, float('inf'), i
elif num < 0:
neg_found, first_neg = neg_found + 1, min(i, first_neg)
if neg_found & 1:
res = max(res, i - first_neg)
else:
res = max(res, i - first_zero)
return res
总结:
- 自己写的,改了三次,还是超时,我佛了
- 搞不懂为啥大家能够写出来这么漂亮的代码,我佛了
class Solution:
def getMaxLen(self, nums: List[int]) -> int:
res = 0
for i in nums:
temp, temp_odd = 0, 0
index_i = nums.index(i)
for inx, j in enumerate(nums[index_i:]):
if j > 0:
temp += 1
elif j <0:
temp_odd += 1
else:
break
print('temp, temp_odd',temp, temp_odd)
if temp_odd % 2 == 0:
temp += temp_odd
else:
if inx + index_i == len(nums) - 1:
inx += 1
print('index_i, inx', index_i,inx + index_i)
temp_list = list(reversed(nums[index_i:inx + index_i]))
print('temp_list', temp_list)
for i,x in enumerate(temp_list):
print(i, x)
if x > 0:
temp -= 1
else:
break
print('temp,temp_odd',temp,temp_odd)
temp += temp_odd - 1
if temp > res:
res = temp
return res