LeetCode 152. 乘积最大子数组

ops/2024/10/21 9:30:57/

LeetCode 152. 乘积最大子数组

给你一个整数数组 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-位 整数

动态规划

class Solution:def maxProduct(self, nums: List[int]) -> int:# s[i] 表示以 nums[i] 结尾的乘积最小的数组的乘积大小# g[i] 表示以 nums[i] 结尾的乘积最大的数组的乘积大小# s[i] = min{s[i-1] * nums[i], g[i-1] * nums[i], nums[i]}# g[i] = max{s[i-1] * nums[i], g[i-1] * nums[i], nums[i]}s, g = [sys.maxsize] * len(nums), [-sys.maxsize] * len(nums)s[0] = g[0] = nums[0]for i in range(1, len(nums)):s[i] = min(s[i - 1] * nums[i], g[i - 1] * nums[i], nums[i])g[i] = max(s[i - 1] * nums[i], g[i - 1] * nums[i], nums[i])return max(g)

时间复杂度:O(n)
空间复杂度:O(n)

优化方案,由于状态转移方程中当前状态仅仅依赖于上一个状态,所以数组可以压缩为一个变量,O(n)可以优化为O(1)

class Solution:def maxProduct(self, nums: List[int]) -> int:# s[i] 表示以 nums[i] 结尾的乘积最小的数组的乘积大小# g[i] 表示以 nums[i] 结尾的乘积最大的数组的乘积大小# s[i] = min{s[i-1] * nums[i], g[i-1] * nums[i], nums[i]}# g[i] = max{s[i-1] * nums[i], g[i-1] * nums[i], nums[i]}res = s = g = nums[0]for i in range(1, len(nums)):_s = min(s * nums[i], g * nums[i], nums[i])_g = max(s * nums[i], g * nums[i], nums[i])s, g = _s, _gres = max(res, g)return res

时间复杂度:O(n)
空间复杂度:O(1)


http://www.ppmy.cn/ops/121199.html

相关文章

VSCode rust文件中的api点击无法跳转问题

如果配置了vscode的setting.json windows端的话 "settings": { "typescript.tsc.autoDetect": "off","rust-analyzer.linkedProjects": [".\\gui-btn\\Cargo.toml",".\\temp\\Cargo.toml", ],其他端类似 能不…

从0学习React(1)

上次在写关于index.tsx的解析的文章的时候&#xff0c;写着写着我突然发现文章太长了&#xff0c;以至于我把代码的很多细节都给忽略掉&#xff0c;只把index.tsx文件的大致结构给写了出来。所以接下来的几篇文章&#xff0c;我将会把index.tsx分成很多个部分&#xff0c;我争取…

CSS列表

在网页中很多地方都会用到列表&#xff0c;例如导航菜单、新闻列表、商品分类等等。您除了可以使用 HTML 中的一些属性来对列表进行简单的设置外&#xff0c;在 CSS 中也提供了几种专门用来设置和格式化列表的属性&#xff0c;如下所示&#xff1a; list-style-type&#xff1…

【C++算法】8.双指针_三数之和

文章目录 题目链接&#xff1a;题目描述&#xff1a;解法C 算法代码&#xff1a;图解 题目链接&#xff1a; 15.三数之和 题目描述&#xff1a; 解法 解法一&#xff1a;排序暴力枚举利用set去重O(n3) 例如nums[-1&#xff0c;0&#xff0c;1&#xff0c;2&#xff0c;-1&…

一个简单的摄像头应用程序4

我们进一步完善了这个app01.py,我们优化了界面使其更人性化,下面介绍中包含了原有的功能及新增的功能: 创建和管理文件夹: create_folder 函数用于创建保存照片和视频的文件夹。 get_next_file_number 函数用于获取文件夹中下一个可用的文件编号。 图像处理: pil_to_cv 函…

8c语言基础文件

关于文件你必须了解的一些基本概念 什么是文件&#xff1f; 文件是计算机文件&#xff0c;属于文件的一种&#xff0c;与普通文件的载体不同&#xff0c;计算机文件是以计算机硬盘为载体存储在计算机上的信息集合。 在程序设计中&#xff0c;我们一般关注的文件有两类&#x…

从 TCP Reno 经 BIC 到 CUBIC

重读 TCP拥塞控制算法-从BIC到CUBIC 以及 cubic 的 tcp friendliness 与拐点控制 这两篇文章&#xff0c;感觉还是啰嗦了&#xff0c;今日重新一气呵成这个话题。 reno 线性逼近管道容量 Wmax&#xff0c;相当于一次查询(capacity-seeking)&#xff0c;但长肥管道从 0.5*Wmax …

MQTTnet.Extensions.ManagedClient客户端连接

一、MQTT客户端 代码如下&#xff08;示例&#xff09;&#xff1a; using MQTTnet; using MQTTnet.Client; using MQTTnet.Extensions.ManagedClient; using MQTTnet.Protocol; using MQTTnet.Server; using System; using System.Collections.Generic; using System.Linq…