博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[LeetCode] 152. Maximum Product Subarray_Medium tag: Dynamic Programming
阅读量:4473 次
发布时间:2019-06-08

本文共 2041 字,大约阅读时间需要 6 分钟。

 

Given an integer array nums, find the contiguous subarray within an array (containing at least one number) which has the largest product.

Example 1:

Input: [2,3,-2,4]Output: 6Explanation: [2,3] has the largest product 6.

Example 2:

Input: [-2,0,-1]Output: 0Explanation: The result cannot be 2, because [-2,-1] is not a subarray.

 

08/01/2018 update: 在code里面可以用

dp_max[i%2] = max(ma, mi, num)dp_min[i%2] = min(mi, mi, num) 去代替之前的6行.

这个题目实际上是的follow up, 有点要注意的是如果我们只用 A[i] 是max value which contains nums[i] for sure, 

then A[i] = max(A[i-1] * nums[i], nums[i]), 不够了, 比如说 [2, 3, -2, 4, -1] , 最大值应该为48, 但是我们得到最大值为6, 因为在nums[i] < 0 时, 我们应该将之前的最小值* nums[i] 去得到最大值. 所以有两个dp数组, 一个记录最小值, 一个记录最大值, 每次将最大值和ans比较, 最后返回ans

 

1. Constraints

1) size >=1 

2)element , integer

 

2. Ideas

Dynamic Programming        T: O(n)     S; O(1)   using rolling array

 

3. Code

3.1) S; O(n)

class Solution:    def maxProductSubarry(self, nums):        n = len(nums)        dp_max, dp_min = [0]*n, [0]*n        dp_max[0], dp_min[0], ans = nums[0], nums[0], nums[0]        for i in range(1, n):            if nums[i] > 0:                dp_max[i] = max(dp_max[i-1] * nums[i], nums[i])                dp_min[i] = min(dp_min[i-1] * nums[i], nums[i])            else:                dp_max[i] = max(dp_min[i-1] * nums[i], nums[i])                dp_min[i] = min(dp_max[i-1] * nums[i], nums[i])            ans = max(ans, dp_max[i])        return ans

 

3.2) S; O(1) using rolling array

class Solution:    def maxProductSubarry(self, nums):        n, n0 = len(nums), nums[0]        dp_max, dp_min, ans = [n0] + [0], [n0] +[0], n0        for i in range(1, n):            num, ma, mi = nums[i], dp_max[(i-1) % 2] * nums[i], dp_min[(i-1) % 2] * nums[i]            if num > 0:                dp_max[i%2] = max(ma, num)                dp_min[i%2] = min(mi, num)            else:                dp_max[i%2] = max(mi, num)                dp_min[i%2] = min(ma, num)            ans = max(ans, dp_max[i%2])        return ans

 

 

4. Test cases

 

 [2, 3, -2, 4, -1]

转载于:https://www.cnblogs.com/Johnsonxiong/p/9404951.html

你可能感兴趣的文章
手工释放linux内存
查看>>
2014-5-30 总结
查看>>
【H3 BPM工作流程管理产品小故事】第四篇 子表创建
查看>>
洛谷P1148 拱猪计分
查看>>
MySQL服务器的安装和配置,MySQL Workbench 8.0.12安装,MySQL的基本使用
查看>>
扑克序列
查看>>
java笔记--适配器模式的运用
查看>>
第一次研究VM程序中的爆破点笔记
查看>>
看雪CTF 2016( 原:CrackMe攻防大赛) 第一题分析
查看>>
JavaWeb--中文乱码
查看>>
二叉树——套路化解题--1.最大搜索二叉子树
查看>>
python测试工程师高端基础面试题整理
查看>>
梳理一下 html 中的一些基本概念
查看>>
SQL Server 2008 备份数据库
查看>>
ab测试 uwsgi遇到的问题
查看>>
Beanstalkd
查看>>
ThreadLocal工作原理
查看>>
opencv相关
查看>>
UPC 2188 Balls(DP)
查看>>
重组索引(带统计索引重组时间)
查看>>