当前位置:网站首页>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;
}
};
边栏推荐
猜你喜欢

LVS负载均衡群集及部署LVS-NAT实验

“蔚来杯“2022牛客暑期多校训练营4 补题题解(N)

实现统一账号登录,sonarqube集成ldap

【Flink】使用arthas在线诊断flink的那些事

【UE4】Build VR live broadcast in LAN UE4.27

为什么要使用 playwright 做浏览器自动化测试?

复杂多层布局的初级智能文本提示器

什么情况下DigiCert证书会引起发生安全警报?

openCV第二篇

Wireshark data capture and analysis of the transport layer protocol (TCP protocol)
随机推荐
visual studio 2012 为啥这么优秀
openCV第一篇
Usage of permute() function in pytorch
YYGH-BUG-06
孩子坐不住就是不专注?猿辅导揭秘专注力的三大误区
5. Software testing ----- automated testing
【Flink】使用arthas在线诊断flink的那些事
常用工具链和虚拟环境-msys2与mingw
服务器在线测速系统源码
超级复杂可贴图布局的初级智能文本提示器
如何准备考pmp?
initramfs详解-----初识initramfs
Jenkins2.328+sonarqube7.9 实现代码自动化检测
kubernetes部署ldap
Likou second week wrong questions collection
QT添加资源文件、样式表、qss文件使用
韦东山 数码相框 项目学习(五)libjpeg-turbo的移植
【Swoole系列3.3】单进程管理Process
MATLAB绘制填充图(X轴上下两种颜色)
常用工具链和虚拟环境-TDMGCC