题解 | #乘积为正数的最长连续子数组#

乘积为正数的最长连续子数组

http://www.nowcoder.com/practice/0112b9b5a09048d89309f55ea666db91

思路:动态规划

dp数组定义:
pt[i]:以第i个数结尾的乘积为正的最长子数组长度
nt[i]:以第i个数结尾的乘积为负的最长子数组长度
dp数组推导式:
第 i 个数为正数时乘积有两种情况:
1.乘积为正,说明以第 i-1 个数结尾的乘积也为正:pt[i] = pt[i-1] + 1
2.乘积为负,说明以第 i-1 个数结尾的乘积也为负:nt[i] = nt[i-1] + 1(需要判断 nt[i-1]是否大于0)
第 i 个数为负数时乘积也有两种情况:
1. 乘积为正,说明以第 i-1 个数结尾的乘积为负:pt[i] = nt[i-1] + 1(需要判断 nt[i-1]是否大于0)
2. 乘积为负,说明以第 i-1 个数结尾的乘积为正:nt[i] = pt[i-1] + 1
第 i 个数为 0 时,乘积也为 0.

代码:

n = int(input())
nums = list(map(int, input().split()))

pt = [0] * n
nt = [0] * n
pt[0] = 1 if nums[0] > 0 else 0
nt[0] = 1 if nums[0] < 0 else 0
res = 0
for i in range(1, n):
    if nums[i] > 0:
        pt[i] = pt[i-1] + 1
        nt[i] = nt[i-1] + 1 if nt[i-1] > 0 else 0
    elif nums[i] < 0:
        pt[i] = nt[i-1] + 1 if nt[i-1] > 0 else 0
        nt[i] = pt[i-1] + 1
    else:
        pt[i] = 0
        nt[i] = 0
    res = max(res, pt[i])

print(res)
可看出每次状态都由上次的状态推导而来,且额外用res记录最大结果,故无需保存每次状态,可直接进行覆盖,无需开辟数组,优化空间,简化代码如下:
n = int(input())
nums = list(map(int, input().split()))

pt = 1 if nums[0] > 0 else 0
nt = 1 if nums[0] < 0 else 0
res = 0
for i in range(1, n):
    if nums[i] > 0:
        pt += 1
        nt += 1 if nt > 0 else 0
    elif nums[i] < 0:
        tmp = pt    # 这里需要注意一下先暂存pt原先的值,避免直接覆盖
        pt = nt + 1 if nt > 0 else 0
        nt = tmp + 1
    else:
        pt = 0
        nt = 0
    res = max(res, pt)

print(res)

全部评论

相关推荐

强大的马里奥:不太可能,我校计算机硕士就业率99%
点赞 评论 收藏
分享
Cherrycola01:0实习 0项目 约等于啥也没有啊 哥们儿这简历认真的吗
点赞 评论 收藏
分享
缓解焦虑的最好方法是回家。鼠鼠昨天上午考完了本科阶段的最后一场考试,大概率考得稀烂,但是没多想,考完立马收拾行李,坐上了提前约好的顺风车飞奔回家。虽然家和学校很近,只有一百多公里的路程,但距离上次回家也已经有三四个月了。每次想回家,期间总有考试、毕业设计、面试、实习等等各种各样的原因,没办法回去,待在学校和公司的每一天也都充斥着无形的压力和焦虑。现在终于完成了答辩,考完了试,公司那边也请了假,是时候回去一趟了。没有提前通知爸妈,想给他们一个惊喜。下午提前到了家,他俩还在上班,只好让外公外婆来给我开门。因为我的回家,晚上外婆在厨房格外忙碌,做了满满一大桌子菜,填饱了我天天吃外卖的肚子。晚上也没空...
梦想是成为七海千秋:取决于家庭吧?其实回家更焦虑了,每天起床父母都问实习找好了没简历投递了没今天有没有面试,但是又没有什么结果,玩两下手机父母就会说你看你啥也没找到为什么天天就知道刷手机,怎么不去学习…我现在就希望我能永远在外面实习,报喜不报忧,等拿到一个好offer再回家
点赞 评论 收藏
分享
评论
9
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务