1、dp数组的含义

maxDP[i]中存储 以nums[i]为结尾元素的子数组的最大乘积
minDP[i]中存储 以nums[i]为结尾元素的子数组的最小乘积

注意到:maxDP[i] >= minDP[i] for all i from 0 to nums.size()-1

2、根据maxDP[i]和minDP[i]的正负,分类讨论

情况1:
如果nums[i] == 0
maxDP[i] 等于 0, 注意:任何数字与0的乘积都是0
minDP[i] 等于 0, 注意:任何数字与0的乘积都是0 情况2:
如果nums[i] > 0
maxDP[i] 等于 max{ nums[i], if maxDP[i-1] <= 0
nums[i]*maxDP[i-1](反证法), if maxDP[i-1] > 0
}
注意:maxDP[i-1]的值,已经覆盖了所有情况,不必再考虑minDP[i-1] minDP[i] 等于 min{ nums[i], if minDP[i-1] > 0(不能往左乘,越乘越大)
nums[i]*minDP[i-1](反证法), if minDP[i-1] <= 0
}
注意:minDP[i-1]的值,已经覆盖了所有情况,不必再考虑maxDP[i-1]
情况3:
如果nums[i] < 0
maxDP[i] 等于 max{ nums[i]*minDP[i-1](反证法), if minDP[i-1] < 0
nums[i], if minDP[i-1] => 0
}
注意:minDP[i-1]的值,已经覆盖了所有情况,不必再考虑maxDP[i-1] minDP[i] 等于 min{ nums[i]*maxDP[i-1](反证法), if maxDP[i-1] > 0
nums[i], if maxDp[i-1] <= 0
}
注意:maxDP[i-1]的值,已经覆盖了所有情况,不必再考虑minDP[i-1] 综上,不论是maxDP[i]还是minDP[i],都是在maxDP[i-1]*nums[i],minDP[i-1]*nums[i],nums[i]这三个数中产生的

maxDP[i]是三个数中最大者,minDP[i]是三个数中最小者


    maxDP[i] = max(maxDP[i-1]*nums[i], max(minDP[i-1]*nums[i], nums[i]))
minDP[i] = min(minDP[i-1]*nums[i], min(maxDP[i-1]*nums[i], nums[i]))

3、实现

class Solution {
public:
int maxProduct(vector<int>& nums) {
vector<int> minDP(nums), maxDP(nums);
int ans = nums[0];
for (int i = 1; i < nums.size(); i++) {
maxDP[i] = max(maxDP[i-1]*nums[i], max(minDP[i-1]*nums[i], nums[i]));
minDP[i] = min(minDP[i-1]*nums[i], min(maxDP[i-1]*nums[i], nums[i]));
if (maxDP[i] > ans)
ans = maxDP[i];
}
return ans;
}
};

leetcode-152乘积最大子数组(两个转移方程的正确性证明)的更多相关文章

  1. 1. 线性DP 152. 乘积最大子数组

    152. 乘积最大子数组  https://leetcode-cn.com/problems/maximum-product-subarray/ func maxProduct(nums []int) ...

  2. [LeetCode] Maximum Subarray 最大子数组

    Find the contiguous subarray within an array (containing at least one number) which has the largest ...

  3. Java实现 LeetCode 152 乘积最大子序列

    152. 乘积最大子序列 给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数). 示例 1: 输入: [2,3,-2,4] 输出: 6 解释: 子数组 [2,3] ...

  4. [Leetcode] maximun subarray 最大子数组

    Find the contiguous subarray within an array (containing at least one number) which has the largest ...

  5. leetcode 刷题(数组篇)152题 乘积最大子数组 (动态规划)

    题目描述 给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积. 示例 1: 输入: [2,3,-2,4] 输出: 6 解释: 子 ...

  6. [LeetCode]152. 乘积最大子序列(DP)

    题目 给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数). 示例 1: 输入: [2,3,-2,4] 输出: 6 解释: 子数组 [2,3] 有最大乘积 6. 示 ...

  7. LeetCode | 152. 乘积最大子序列

    原题(Medium): 给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数). 思路: 遍历数组时且逐元素相乘时,如果遇到了0,在求乘积最大值的情况下,0左边的元素 ...

  8. LeetCode 152. 乘积最大子序列(Maximum Product Subarray)

    题目描述 给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数). 示例 1: 输入: [2,3,-2,4] 输出: 6 解释: 子数组 [2,3] 有最大乘积 6. ...

  9. leetcode 152. 乘积最大子序列 java

    题目: 给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数). 示例 1: 输入: [2,3,-2,4] 输出: 6 解释: 子数组 [2,3] 有最大乘积 6. ...

  10. [LeetCode] 152. Maximum Product Subarray 求最大子数组乘积

    Given an integer array nums, find the contiguous subarray within an array (containing at least one n ...

随机推荐

  1. PostgreSQL 实现快速删除一个用户

    一.具体方法 一般情况下直接执行 drop role xxx; 就可以把这个用户删除.但是很多时候会因为用户有依赖而报错. 二.权限依赖 postgres=# create role test wit ...

  2. Angular UI库

    1.angular 使用 bootstrap 安装bootstrap npm install bootstrap --save 安装bootstrap-icons npm i bootstrap-ic ...

  3. 好用的后台管理模板Bootstrap3

    推荐 好用的后台管理模板 参考链接:https://www.sucaiq.com/moban/1250.html 预览图

  4. mysql查询最近2天数据

    SELECT * FROM jk_dzbl_zybrbljlb where jlrq >= now()-interval 2 day

  5. max virtual memory areas vm.max_map_count 65530 is too low的解决办法

    解决办法 /etc/sysctl.conf加上 vm.max_map_count = 262144 使配置永久生效 执行: sysctl -w vm.max_map_count=262144 使配置立 ...

  6. node、mongodb、服务器相关

    1.CentOs搭建NodeJs服务器-Mongodb安装 2.如何将 node+mongodb 项目部署在服务器上 3.如何通过cmd开一个本地服务器 4.如何部署一个本地的web项目到服务器-搭建 ...

  7. redis底层数据结构之双向链表(linkedlist)

    双向链表(linkedlist) redis的双向链表(linkedlist)是基于链表的一种数据结构 链表是一种常见的基础数据结构,是一种非顺序存储数据的线性表,在每一个节点里存储了下一个节点的指针 ...

  8. Software_programming_EnterpriseArch_ServiceWithSingleTonFactory

    19:50:31 <UML 模式和应用> P322 系统需要支持多种第三方外部服务,例如费用计算,授权服务,库存系统,都具有不同的API, 而且还无法改变. 解决方案之一: 使用 单例模式 ...

  9. Linux系统下修改KVM虚拟机配置

    一. 安装虚拟机 1. 设备重启进入BIOS,打开SMMU.F10保存退出 2. 进入系统后安装线管组件 virt-install qemu-kvm qemu-img virt-manager lib ...

  10. 文件下载,后端接口,django,flask

    Django后端接口 def download_excel(request): """ get excel file from url param and upload ...