leetcode-152乘积最大子数组(两个转移方程的正确性证明)
2024-09-08 18:12:22
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;
}
};
最新文章
- [Machine Learning] 机器学习常见算法分类汇总
- test-output目录中找不到testng-fail.xml原因+Reportng+ant build.xml文件
- XML Data Type Methods(一)
- 在线生成CSS样式和兼容的字体格式
- fetch the words from url
- 手势识别(一)--手势基本概念和ChaLearn Gesture Challenge
- Environment.SpecialFolder.CommonApplicationData
- iOS设计模式之生成器
- CoreAnimation6-基于定时器的动画和性能调优
- 一个测ip和端口是否联通的工具类
- Javascript进阶篇——(DOM—认识DOM、ByName、ByTagName)—笔记整理
- jsp 、js和css
- poj 2229 Sumsets(dp 或 数学)
- android Xml生成一条细线,以及获取屏幕宽度和高度
- Smarterer Test
- C#中的DataTable简单使用Merge
- Python 中的闭包
- LOG4J日志级别详解
- python3 tkinter报错:_tkinter.TclError: cannot use geometry manager pack inside . which already has slaves managed by grid
- Exp3 免杀原理与实践 20164302 王一帆