前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Leetcode 152. 乘积最大子序列

Leetcode 152. 乘积最大子序列

作者头像
zhipingChen
发布2019-06-24 10:03:22
6120
发布2019-06-24 10:03:22
举报
文章被收录于专栏:编程理解编程理解

题目描述

给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)。

示例 1:

输入: [2,3,-2,4] 输出: 6 解释: 子数组 [2,3] 有最大乘积 6。

示例 2:

输入: [-2,0,-1] 输出: 0 解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。

解法

在序列中计算出以任一个节点为终结点的子序列乘积,取最大值返回即可。

首先不妨尝试以

up(i)
up(i)

表示第

i
i

个元素为子序列终结点的最大乘积:

nums[i] \ge 0
nums[i] \ge 0

,则有推导式

up(i)=max[up(i-1)*nums[i], nums[i]]
up(i)=max[up(i-1)*nums[i], nums[i]]
nums[i] < 0
nums[i] < 0

,则以上推导式不成立。不妨以

down(i)
down(i)

表示第

i
i

个元素为子序列终结点的最小乘积,则有

up(i)=max[down(i-1)*nums[i], nums[i]]
up(i)=max[down(i-1)*nums[i], nums[i]]

因为涉及到

down(i)
down(i)

函数,同理可得:

nums[i] \ge 0
nums[i] \ge 0

,则有推导式

down(i)=min[down(i-1)*nums[i], nums[i]]
down(i)=min[down(i-1)*nums[i], nums[i]]
nums[i] < 0
nums[i] < 0

,则有推导式

down(i)=min[up(i-1)*nums[i], nums[i]]
down(i)=min[up(i-1)*nums[i], nums[i]]

因为

up(i),down(i)
up(i),down(i)

只与

up(i-1),down(i-1)
up(i-1),down(i-1)

存在递推关系,不妨以

up,down
up,down

表示每个位置上的最大、最小序列乘积。

代码语言:javascript
复制
class Solution:
    def maxProduct(self, nums: List[int]) -> int:
        ret,up,down=nums[0],nums[0],nums[0]
        for n in nums[1:]:
            if n>=0:
                up,down=max(up*n,n),min(down*n,n)
            else:
                up,down=max(down*n,n),min(up*n,n)
            ret=max(ret,up)
        return ret
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.06.22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档