当前位置:网站首页>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] <= 10
nums
的任何前缀或后缀的乘积都 保证 是一个 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
边栏推荐
猜你喜欢
随机推荐
Basic image processing in opencv
DBPack SQL Tracing 功能及数据加密功能详解
BITS Pilani|SAC-AP:基于 Soft Actor Critic 的深度强化学习用于警报优先级
【Day_09 0427】走方格的方案数
【Day_12 0507】二进制插入
opencv基本的图像处理
电商库存系统的防超卖和高并发扣减方案
OpenCV installation, QT, VS configuration project settings
极化微波成像概述3
What is the implementation principle of Go iota keyword and enumeration type
How to use the Golang coroutine scheduler scheduler
GTK修改pixmap像素,提取pixmap像素RGB值
理财产品的月年化收益率怎么算?
将ENS域名转化为音乐需要几步?
顺序表的简单描述及代码的简单实现
C#/VB.NET:从 PDF 文档中提取所有表格
打开微信客服
创造建材数字转型新视界,中建材如何多边赋能集团业务快速发展
史上最全的Redis基础+进阶项目实战总结笔记
生物制药产业发展现状和趋势展望