[leetcode] 152. Maximum Product Subarray 解题报告
2015-12-22 15:20
549 查看
题目链接:https://leetcode.com/problems/maximum-product-subarray/
Find the contiguous subarray within an array (containing at least one number) which has the largest product.
For example, given the array
the contiguous subarray
思路:因为会有负负得正,正负得负的情况,所以保存每一位的最小值和最大值。而其最小值和最大值与三个状态相关,即上次最大值,上次最小值,当前数。因此状态转移方程为:
minP[i] = min(minP[i-1]*nums[i], maxP[i-1]*nums[i], nums[i]);
maxP[i] = max(minP[i-1]*nums[i], maxP[i-1]*nums[i], nums[i]);
以上状态转移方程记录了当前局部的最大最小值,再用一个值记录全局最大值,每次与局部最大值比较,最后即可得到最大的连续积。
时间复杂度为O(n), 空间复杂度为O(n)。
代码如下:
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.
思路:因为会有负负得正,正负得负的情况,所以保存每一位的最小值和最大值。而其最小值和最大值与三个状态相关,即上次最大值,上次最小值,当前数。因此状态转移方程为:
minP[i] = min(minP[i-1]*nums[i], maxP[i-1]*nums[i], nums[i]);
maxP[i] = max(minP[i-1]*nums[i], maxP[i-1]*nums[i], nums[i]);
以上状态转移方程记录了当前局部的最大最小值,再用一个值记录全局最大值,每次与局部最大值比较,最后即可得到最大的连续积。
时间复杂度为O(n), 空间复杂度为O(n)。
代码如下:
class Solution { public: int maxProduct(vector<int>& nums) { if(nums.size() ==0) return 0; int len = nums.size(), Max = INT_MIN; vector<int> maxDp(len+1, 1), minDp(len+1, 1); for(int i = 1; i<= len; i++) { maxDp[i]=max(nums[i-1],max(maxDp[i-1]*nums[i-1],minDp[i-1]*nums[i-1])); minDp[i]=min(nums[i-1],min(maxDp[i-1]*nums[i-1],minDp[i-1]*nums[i-1])); Max = max(Max, maxDp[i]); } return Max; } };参考:
相关文章推荐
- Servlet生命周期
- 算法训练 区间k大数查询
- android.mk文件语法
- web页面状态码的含义
- 关于EditText默认会弹出输入法的问题
- JUC结构图
- Android Style之属性动画
- php 下 POST方法提交参数丢失问题
- IL2CPP的前世今生
- IL2CPP的前世今生
- ios...参数(不定参数)
- C语言printf函数格式化打印之长整型
- JQuery的链式操作
- JS控制图片显示的大小(图片等比例缩放)
- Android样式的开发之drawable
- 三星手机调用系统相机 activity被销毁
- 《Linux应用大全 基础与管理》一书,讲述日常系统管理内容
- Android入门之Activity四种启动模式(standard、singleTop、singleTask、singleInstance)
- 微博客户端授权的时候不回调WeiboAuthListener里面的方法
- C语言中a[++i],a[i++]