找出最具竞争力的子序列_Go实现算法:乘积最大子序列(LeetCode)

题目:

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

示例 1:

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

示例 2:

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

解题思路:因为是整数数组,所以不考虑小数,只考虑负数、正数和0。当遇到0则对应下一个新的序列要开始;遇到负数,当前最大值会变成最小值。

代码实现比较简单:

func maxProduct(nums []int) int {

if nums==nil || len(nums)==0{

return 0

}

ret:=nums[0]

currentMax:=1

currentMin:=1

for i:=0;i

if nums[i]<0{//遇到负数,最大数变最小数,最小变最大

currentMax,currentMin=currentMin,currentMax

}

currentMax=max(currentMax*nums[i],nums[i])

currentMin=min(currentMin*nums[i],nums[i])

ret=max(currentMax,ret)

}

return ret

}
//求大值

func max(a,b int)int{

if a>b{

return a

}

return b

}

//求小值

func min(a,b int)int{

if a>b{

return b

}

return a

}

执行用时4ms

5384b587c6e7d40e0703d3bf272cf6f0.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值