当前位置:网站首页>leetcode:152. 乘积最大子数组
leetcode:152. 乘积最大子数组
2022-08-03 02:04:00 【OceanStar的学习笔记】
题目来源
题目描述
题目解析
- 对于子数组问题,其dp一般定义为:必须以nums[i]结尾的子数组…,然后对于每一个dp[i]有两种选择:
- 仅仅选择nums[i]
- 以nums[i]为基地,向前扩展
- 这里特殊的是:两个负数相乘可能会变得很大,负数*正数可能会变得很小。所以我们需要同时维护两个值-----最大值、最小值
class Solution {
struct info{
int max;
int min; // 两个负数相乘可能变得很大
info(){
max = INT32_MIN;
min = INT32_MAX;
}
};
public:
int maxProduct(vector<int>& nums) {
int N = nums.size();
if(N == 0){
return 0;
}
//该子数组中至少包含一个数字
if(N == 1){
return nums[0];
}
std::vector<info> dp(N); //必须以num[i]结尾的最大乘积子数组
dp[0].min = nums[0];
dp[0].max = nums[0];
int ans = nums[0];
for (int i = 1; i < N; ++i) {
int p1 = nums[i];
int p2 = nums[i] * dp[i - 1].min; // 两个负数相乘可能变得很大
int p3 = nums[i] * dp[i - 1].max; // 测试用例的答案是一个 32-位 整数。 不会溢出
dp[i].min = std::min(p1, std::min(p2, p3));
dp[i].max = std::max(p1, std::max(p2, p3));
ans = std::max(ans, dp[i].max);
}
return ans;
}
};
上面,因为dp[i]仅仅依赖dp[i-1],所以:
class Solution {
public:
int maxProduct(vector<int>& nums) {
int N = nums.size();
if(N == 0){
return 0;
}
int pMin = nums[0];
int pMax = nums[0];
int ans = nums[0];
for (int i = 1; i < N; ++i) {
int cMin = std::min(nums[i], std::min(nums[i] * pMin, nums[i] * pMax));
int cMax = std::max(nums[i], std::max(nums[i] * pMin, nums[i] * pMax));
ans = std::max(ans, cMax);
pMin = cMin;
pMax = cMax;
}
return ans;
}
};
边栏推荐
- 使用VSCode中遇到的问题及解决办法
- Topic Modeling of Short Texts: A Pseudo-Document View
- 韦东山 数码相框 项目学习(五)libjpeg-turbo的移植
- flask-socketio实现websocket通信
- 孩子坐不住就是不专注?猿辅导揭秘专注力的三大误区
- 国标GB28181协议EasyGBS平台项目现场通知消息过多导致系统卡顿该如何解决?
- LVS负载均衡群集及部署LVS-NAT实验
- iNFTnews | 元宇宙的潜力:一股推动社会进步的力量
- 部门之间,互不信任正常吗?(你是否遇到过)
- 通过kubernetes可视化界面(rancher)安装kibana
猜你喜欢
数据中台建设(八):数据服务体系建设
QWidget、QPushButton、
SPI机制是什么?
The Sandbox 市场平台将上线 Isla Obscura 第五期 NFT 作品集
[Example构造方法增加notNull参数,默认false,允许值为null,值为null的时候不加入到条件中
【社媒营销】Facebook速推帖子如何运作?值得吗?
【面经】被虐了之后,我翻烂了equals源码,总结如下
韦东山 数码相框 项目学习(五)libjpeg-turbo的移植
initramfs详解-----初识initramfs
5. Software testing ----- automated testing
随机推荐
关于提高企业网络安全意识
ES6 新特性:Class 的基本语法
为什么要使用 playwright 做浏览器自动化测试?
win下使用vscode+wsl2
PHICOMM(斐讯)N1盒子 - recovery模式救砖卡登录页LOGO卡1%卡4%卡26%
236. The binary tree in recent common ancestor
Topic Modeling of Short Texts: A Pseudo-Document View
numpy PIL tensor之间的相互转换
钻石基础知识介绍
大厂标配 | 百亿级并发系统设计 | 学完薪资框框涨
【社媒营销】Facebook速推帖子如何运作?值得吗?
Kubernetes:(八)调度约束和故障排查
EasyGBS播放器优化:设备通道视频播放出现跳屏问题的修复
【云原生】阿里云ARMS业务实时监控
一篇文章玩明白Stack-migration
Disable the token and update the token function without awareness
【Flink】如何生成 Flink 作业的交互式火焰图?
【Objective-C语言中的@property增强】
堆的应用:堆排序和TOP-K问题
粘包与拆包