当前位置:网站首页>LeetCode 0152. 乘积最大子数组:dp + 原地滚动
LeetCode 0152. 乘积最大子数组:dp + 原地滚动
2022-08-01 18:11:00 【Tisfy】
【LetMeFly】152.乘积最大子数组:dp + 原地滚动
力扣题目链接:https://leetcode.cn/problems/maximum-product-subarray/
给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。
测试用例的答案是一个 32-位 整数。
子数组 是数组的连续子序列。
示例 1:
输入: nums = [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。
示例 2:
输入: nums = [-2,0,-1] 输出: 0 解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。
提示:
1 <= nums.length <= 2 * 104-10 <= nums[i] <= 10nums的任何前缀或后缀的乘积都 保证 是一个 32-位 整数
方法一:dp + 原地滚动
需要两个变量 m m m和 M M M,分别表示以当前处理到的数字为结尾的乘积最大子数组
初始值 m m m和 M M M都是数组中第一个元素nums[0]
i i i从下标1开始遍历数组,既然要以下标 i i i为连续数组的结尾,那么就有三种选择:
- 只选择当前这个下标为 i i i的元素( n u m s [ i ] nums[i] nums[i])
- 使用以上一个元素结尾的子数组的最大乘积 乘上 这个元素( n u m s [ i ] ∗ M nums[i] * M nums[i]∗M)
- 使用以上一个元素结尾的子数组的最小乘积 乘上 这个元素( n u m s [ i ] ∗ m nums[i] * m nums[i]∗m)
每遍历到每一个元素时,计算上述三个新的可能的极值,并更新 m m m和 M M M,同时记录一下整个遍历过程中答案的最大值即可。
Q&S: 为什么还要记录最小值 m m m而不是仅仅记录最大值 M M M?
因为最大值可能由两个负数相乘得到。如果是两个负数相乘的话,负数越小乘积越大。
- 时间复杂度 O ( n ) O(n) O(n),其中 n n n是数组
nums中元素的个数 - 空间复杂度 O ( 1 ) O(1) O(1)
AC代码
C++
class Solution {
public:
int maxProduct(vector<int>& nums) {
int ans = nums[0];
int m = nums[0], M = nums[0];
for (int i = 1; i < nums.size(); i++) {
int timesLastm = m * nums[i];
int timesLastM = M * nums[i];
m = min(nums[i], min(timesLastm, timesLastM));
M = max(nums[i], max(timesLastm, timesLastM));
ans = max(ans, M);
}
return ans;
}
};

同步发文于CSDN,原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/126094071
边栏推荐
- 【无标题】setInterval和setTimeout详解
- 浅谈大数据背景下数据库安全保障体系
- sql添加索引
- Leetcode75. 颜色分类
- University of California | Inverse Reinforcement Learning from Different Third-Person Videos via Graph Abstraction
- Leetcode74. 搜索二维矩阵
- MySQL关系型数据库事务的ACID特性与实现方法
- Multi-Party Threshold Private Set Intersection with Sublinear Communication-2021:解读
- 突破性能天花板!亚信数据库支撑 10 多亿用户,峰值每秒百万交易
- 极化微波成像概述2
猜你喜欢

计算IoU(D2L)

MySQL 45 Talk | 09 How to choose common index and unique index?

Golang协程调度器scheduler怎么使用

基于ORB-SLAM2的改进代码

【Error】Uncaught (in promise) TypeError: Cannot read properties of undefined (reading ‘concat’)
OnePlus 10RT appears on Geekbench, product launch also seems to be approaching

QLineEdit learning and use

创造建材数字转型新视界,中建材如何多边赋能集团业务快速发展

生物制药产业发展现状和趋势展望

QT basic functions, signals, slots
随机推荐
8月微软技术课程,欢迎参与
中信证券是国内十大券商吗?怎么开户安全?
Basic image processing in opencv
如何让固定点的监控设备在EasyCVR平台GIS电子地图上显示地理位置?
MySQL关系型数据库事务的ACID特性与实现方法
千万级乘客排队系统重构&压测方案总结篇
【Translation】OpenMetrics cultivated by CNCF becomes an incubation project
What is the JVM runtime data area and the JMM memory model
暑假第二周总结博客
消息模板占位符的使用
三维空间中点的插值
opencv语法Mat类型总结
Leetcode74. 搜索二维矩阵
顺序表的简单描述及代码的简单实现
golang json returns null
Leetcode71. Simplified Paths
行业沙龙第二期丨如何通过供应链数字化业务协同,赋能化工企业降本增效?
存储日报-数据湖架构权威指南(使用 Iceberg 和 MinIO)
golang json 返回空值
基于BiGRU和GAN的数据生成方法