152. Maximum Product Subarray 以及 讨论【最大连续子序列】

题目大意:
连续最大子段积
题目思路:
最大值只能产生在一个正数x一个正数,一个负数乘一个负数,所以维护两个值,一个区间最大值,一个最小值
其他的话:
在讨论这个问题之前,我先来说一说大一刚开学就学了的最简单的dp问题之一的【最大连续子序列】
先来看一个数组a{ -2, 11, -4, 13, -5, -2 },求连续子序列中和最大的那个
对于第i个数来说,dp[i]表示,以i结尾的序列最大的和为dp[i]
状态转移方程为dp[i] = max{ dp[i-1] + a[i], a[i] }
无论哪个序列和最大,我们都可以表示为以a[i]结尾的子序列
我们先设dp[0] = a[0]
那么对于每一个a[i]来说,它只有两个选择
1)作为上一个序列的结尾
2)以自己为新的开始,作自己的结尾
如果那么就比较情况1)和情况2)哪个更大了,所以就出现了上面的表达式max{ dp[i-1] + a[i], a[i] }
最后只要遍历dp[]就可以找出最大值,因为如第五行所说,最大值一定存在于dp[]之中
同理:
对于这道题来说,唯一的区别就是前面的负数在这道题的上下文中或许是有用的,而在上一道题里负数是我们所不喜欢的
又因为xxxxxx....(还没组织好语言。。。。。。。以后再填坑)反正就是最大值可能由一个最大正数乘一个正数得到,也可能由一个最小的负数乘一个负数得到
我们需要再维护一个dp_min[]来保存以a[i]结尾的最小值
class Solution {
public:
int maxProduct(vector<int>& nums) {
int dp_max[nums.size()];
int dp_min[nums.size()];
dp_max[] = dp_min[] = nums[];
for (int i = ; i < nums.size(); i++) {
dp_max[i] = max(max(dp_max[i-]*nums[i], nums[i]), dp_min[i-]*nums[i]);
dp_min[i] = min(min(dp_min[i-]*nums[i], nums[i]), dp_max[i-]*nums[i]);
}
int ans = dp_max[];
for(int i=;i<nums.size();i++) ans = max(ans, dp_max[i]);
return ans;
}
};
152. Maximum Product Subarray 以及 讨论【最大连续子序列】的更多相关文章
- 152. Maximum Product Subarray - LeetCode
Question 152. Maximum Product Subarray Solution 题目大意:求数列中连续子序列的最大连乘积 思路:动态规划实现,现在动态规划理解的还不透,照着公式往上套的 ...
- leetcode 53. Maximum Subarray 、152. Maximum Product Subarray
53. Maximum Subarray 之前的值小于0就不加了.dp[i]表示以i结尾当前的最大和,所以需要用一个变量保存最大值. 动态规划的方法: class Solution { public: ...
- 求连续最大子序列积 - leetcode. 152 Maximum Product Subarray
题目链接:Maximum Product Subarray solutions同步在github 题目很简单,给一个数组,求一个连续的子数组,使得数组元素之积最大.这是求连续最大子序列和的加强版,我们 ...
- 【刷题-LeetCode】152 Maximum Product Subarray
Maximum Product Subarray Given an integer array nums, find the contiguous subarray within an array ( ...
- [LeetCode] 152. Maximum Product Subarray 求最大子数组乘积
Given an integer array nums, find the contiguous subarray within an array (containing at least one n ...
- [LeetCode]152. Maximum Product Subarray
This a task that asks u to compute the maximum product from a continue subarray. However, you need t ...
- 【LeetCode】152. Maximum Product Subarray 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 双重循环 动态规划 参考资料 日期 题目地址:htt ...
- LeetCode 152. Maximum Product Subarray (最大乘积子数组)
Find the contiguous subarray within an array (containing at least one number) which has the largest ...
- 152 Maximum Product Subarray 乘积最大子序列
找出一个序列中乘积最大的连续子序列(该序列至少包含一个数).例如, 给定序列 [2,3,-2,4],其中乘积最大的子序列为 [2,3] 其乘积为 6.详见:https://leetcode.com/p ...
随机推荐
- a标签中的onclick和href的使用
onclick和href 链接的 onclick 事件被先执行,其次是 href 属性下的动作(页面跳转,或 javascript 伪链接): 假设链接中同时存在 href 与 onclick,如果 ...
- laravel打印sql
DB::connection()->enableQueryLog(); print_r(DB::getQueryLog());
- 剑指Offer(9)
题目: 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 解法: 要考虑到底数为0,指数为负数的情况,这道题主要考的是对边界值的思考. p ...
- Java 线程的创建和启动
Java 使用 Thread 类代表线程,所有的线程对象都必须是 Thread 类或其子类的实例.每个线程的作用是完成一定的任务,实际上就是执行一段程序流(一段顺序执行的代码). Java 使用线程执 ...
- Flutter常用插件
Dio Dio是一个强大的Dart Http请求库,支持Restful API.FormData.拦截器.请求取消等操作.视频中将全面学习和使用Dio的操作. Flutter_swiper swipe ...
- Java变量类型识别的3种方式
内容导览 反射方式,成员变量的类型判断 isInstance用法 利用泛型识别类型 测试类: package com.cxyapi.oo; import java.util.Date; import ...
- C#中as运算符
as运算符用于执行引用类型的显式类型转换.如果要转换的类型与指定的类型兼容,转换就会成功进行:如果类型不兼容,as运算符就会返回null值.如下面的代码所示,如果object引用实际上不引用strin ...
- 【README.md】Markdown语言常用语法
转自:http://blog.csdn.net/zhaokaiqiang1992 这里只介绍最常用和最常见的功能,若想查看全部的语法,请移步http://wowubuntu.com/markdown/ ...
- How to install Windows 7 SP1 on Skylake
Download gigabyte windows usb installation tool http://www.gigabyte.cn/WebPage/-79/usb.html get Wind ...
- codeforces493B
Vasya and Wrestling CodeForces - 493B Vasya has become interested in wrestling. In wrestling wrestle ...