[Leetcode] 152. Maximum Product Subarray
来源:互联网 发布:linux free swap 编辑:程序博客网 时间:2024/06/08 18:31
题目:
Find the contiguous subarray within an array (containing at least one number) which has the largest product.
For example, given the array [2,3,-2,4]
,
the contiguous subarray [2,3]
has the largest product = 6
.
思路:
个人感觉刷题就好像是准备高考数学题一样,做的多了,就慢慢觉得有套路了。我看到题目之后就觉得似乎是DP问题。不过和一般的DP还有一点不同:因为会负负得正,正负得负,所以需要同时保存截止某一位的最大值和最小值。而最大值和最小值又和三个变量相关:上次最大值,上次最小值以及当前数。因此状态转移方程为:
dp_min[i] = min (min(dp_min[i-1] * nums[i], dp_max[i-1] * nums[i]), nums[i])
dp_max[i] = max(max(dp_min[i-1] * nums[i], dp_max[i-1] * nums[i]), nums[i]).
这里dp_min和dp_max分别记录了截止目前的局部最大值和最小值。再用一个值记录一下全局最大值,每次与局部最大值相比较,最后就可以得到最大的连续乘积。时间复杂度是O(n),空间复杂度也是O(n)。
通过观察递推式可以发现,dp_min[i]以及dp_max[i]只和dp_min[i-1]以及dp_max[i-1]有关,所以我们可以将空间复杂度进一步降低到O(1)。具体代码请见下面。
代码:
class Solution {public: int maxProduct(vector<int>& nums) { if(nums.size() == 0) { return 0; } int max_global = nums[0]; int max_local = nums[0]; int min_local = nums[0]; for(int i = 1; i < nums.size(); ++i) { int a = nums[i] * max_local; int b = nums[i] * min_local; max_local = max(max(a, b), nums[i]); min_local = min(min(a, b), nums[i]); max_global = max(max_global, max_local); } return max_global; }};
- LeetCode 152. Maximum Product Subarray
- [leetcode] 152.Maximum Product Subarray
- [LeetCode]152. Maximum Product Subarray
- leetcode:152. Maximum Product Subarray
- leetcode 152. Maximum Product Subarray
- 152. Maximum Product Subarray LeetCode
- [leetcode] 152. Maximum Product Subarray
- LeetCode *** 152. Maximum Product Subarray
- LeetCode 152. Maximum Product Subarray
- leetcode.152. Maximum Product Subarray
- LeetCode-152.Maximum Product Subarray
- LeetCode - 152. Maximum Product Subarray
- [Leetcode]152. Maximum Product Subarray
- LeetCode 152. Maximum Product Subarray
- leetcode:152. Maximum Product Subarray
- [leetcode]152. Maximum Product Subarray
- LeetCode 152. Maximum Product Subarray
- [LeetCode] 152. Maximum Product Subarray
- 4.4抽象类
- @ExceptionHandler
- django.core.exceptions.ImproperlyConfigured:
- Android开发艺术探索学习摘要(五)
- c# 面向对象基础技能
- [Leetcode] 152. Maximum Product Subarray
- git使用手册
- 在C程序中调用汇编函数
- Scala学习七:数组
- [Debug]
- caffe 借助自己图像在imagenet网络中实践
- leetcode rotate-image(90°旋转矩阵)
- CSS box-sizing 属性详解
- DNS的配置