动态规划中级教程(leetcode)152.Maximum Product Subarray
2017-07-26 09:52
253 查看
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
[-2,3,-4]
dp[2]
[-2] dp[0][0]=-2 dp[1][0]=-2
[-2,3] dp[0][i]=max(nume[i],dp[0][i-1]*nums[i],dp[1][i-1]*nums[i]) dp[1][i]=min(numi[i],dp[0][i-1]*nums[i],dp[1][i-1]*nums[i])
这个状态转移一开始肯定不是这样我直接把最后修正结果放这里,我们要记录最小值的原因是
【-2,3,-4】这个的结果是24因为我们数组中有负数导致
class Solution {
public:
int maxProduct(vector<int>& nums) {
if(nums.size()==0)
{
return NULL;
}
if(nums.size()==1)
{
return nums[0];
}
int dp[2][nums.size()];
for(int i=0;i<2;i++)
{
for(int j=0;j<nums.size();j++)
{
dp[i][j]=0;
}
}
dp[0][0]=nums[0];
dp[1][0]=nums[0];
int ans=nums[0];
for(int i=1;i<nums.size();i++)
{
dp[0][i]=max(nums[i],dp[0][i-1]*nums[i]);
dp[0][i]=max(dp[0][i],dp[1][i-1]*nums[i]);
ans=max(ans,dp[0][i]);
dp[1][i]=min(nums[i],dp[0][i-1]*nums[i]);
dp[1][i]=min(dp[1][i],dp[1][i-1]*nums[i]);
}
return ans;
}
};
For example, given the array
[2,3,-2,4],
the contiguous subarray
[2,3]has the largest product =
6.
[-2,3,-4]
dp[2]
[-2] dp[0][0]=-2 dp[1][0]=-2
[-2,3] dp[0][i]=max(nume[i],dp[0][i-1]*nums[i],dp[1][i-1]*nums[i]) dp[1][i]=min(numi[i],dp[0][i-1]*nums[i],dp[1][i-1]*nums[i])
这个状态转移一开始肯定不是这样我直接把最后修正结果放这里,我们要记录最小值的原因是
【-2,3,-4】这个的结果是24因为我们数组中有负数导致
class Solution {
public:
int maxProduct(vector<int>& nums) {
if(nums.size()==0)
{
return NULL;
}
if(nums.size()==1)
{
return nums[0];
}
int dp[2][nums.size()];
for(int i=0;i<2;i++)
{
for(int j=0;j<nums.size();j++)
{
dp[i][j]=0;
}
}
dp[0][0]=nums[0];
dp[1][0]=nums[0];
int ans=nums[0];
for(int i=1;i<nums.size();i++)
{
dp[0][i]=max(nums[i],dp[0][i-1]*nums[i]);
dp[0][i]=max(dp[0][i],dp[1][i-1]*nums[i]);
ans=max(ans,dp[0][i]);
dp[1][i]=min(nums[i],dp[0][i-1]*nums[i]);
dp[1][i]=min(dp[1][i],dp[1][i-1]*nums[i]);
}
return ans;
}
};
相关文章推荐
- 动态规划中级教程300.Longest Increasing Subsequence
- 动态规划中级教程 279. Perfect Squares
- 动态规划中级教程 646. Maximum Length of Pair Chain
- 动态规划中级教程 377. Combination Sum IV
- 动态规划中级教程 322. Coin Change
- 动态规划中级教程 343. Integer Break
- (动态规划)LeetCode#152. Maximum Product Subarray
- leetcode_121题——Best Time to Buy and Sell Stock(动态规划)
- Android[中级教程] 深入剖析Android消息机制
- leetcode-动态规划
- linux shell的中级教程
- mybatis学习教程中级(十一)mybatis和spring框架整合(前奏篇2)
- Leetcode解题笔记 64. Minimum Path Sum [Medium] 动态规划
- C++ DirectX 游戏开发中级视频教程 04 资源下载链接
- HTML中级教程 - 1.关于“Span”和“Div”的使用
- LeetCode 650. 2 Keys Keyboard--动态规划
- 非常特别的一个动态规划新手教程
- 微信小程序教学第二章(含视频):小程序中级实战教程之预备篇 - 提取util公用方法 |基于最新版1.0开发者工具
- Android中级教程(三)之不同Activity之间的数据传递---Bundle对象的使用!
- 动态规划第六讲——leetcode上的动态规划汇总(下)