leetcode 5500. maximum-length-of-subarray-with-positive-product 乘积为正数的最长子数组长度 python3

时间: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

总结:

  1. 自己写的,改了三次,还是超时,我佛了
  2. 搞不懂为啥大家能够写出来这么漂亮的代码,我佛了
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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值