leetcode 152. 乘积最大子数组

news/2024/11/19 17:27:42/

题目链接:leetcode 152

1.题目

给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。

测试用例的答案是一个 32-位 整数。

子数组 是数组的连续子序列。

2.示例

1)示例 1:
输入: nums = [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。

2)示例 2:
输入: nums = [-2,0,-1]
输出: 0
解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。

3)提示:
1 <= nums.length <= 2 * 10^4
-10 <= nums[i] <= 10
nums 的任何前缀或后缀的乘积都 保证 是一个 32-位 整数

3.分析

首先考虑数组中的特殊情况,也就是包含0 的情况,当所有子树组中包含0时,那么子树组乘积结果均为0。可以考虑以0作为分割标准分割出子树组。那么对于分割后的子树组,当我们考虑负数的情况,当区间内只有一个负数时,子树组乘积取最大只能是它左边的正数乘积,或者它右边的正数乘积(或者它自己)。当区间内包含多个(cnt)负数时,当cnt为偶数时,结果就是该树组本身乘积。当cnt为奇数时,对于第i个奇数,它可以选择该区间内第一个奇数及其左边部分,也可以选择最后一个奇数及其右边部分。但这道题目需要注意一些边界特殊条件。

4.代码

class Solution(object):def get_qz_j(self,nums):qz,res=[],1for i in nums:res*=iqz.append(res)return qzdef get_qz_fs(self,nums):res,qz_fs=1,0for i in nums:res*=iif i<0:return resreturn 1def get_hz_fs(self,nums):res=1for i in range(len(nums)-1,-1,-1):res*=nums[i]if nums[i]<0:return resreturn 1def get_max(self,nums):qz_j=self.get_qz_j(nums)qz_fs,hz_fs,res=self.get_qz_fs(nums),self.get_hz_fs(nums),1ans=qz_j[len(nums)-1]cnt,id1=0,0for i in range(len(nums)):if nums[i] <0:cnt+=1id1=iif cnt%2==0:return ansif cnt==1:if id1!=0:ans=max(ans,qz_j[len(nums)-1]/hz_fs)if id1!=len(nums)-1:ans=max(ans,qz_j[len(nums)-1]/qz_fs)else:ans=max(ans,qz_j[len(nums)-1]/qz_fs)ans=max(ans,qz_j[len(nums)-1]/hz_fs)return ansdef get_max_sum(self,nums):flag,ans,last=0,-1000000000,0for i in range(len(nums)):if nums[i]==0:flag=1if i!=last:ans=max(ans,self.get_max(nums[last:i]))last=i+1ans=max(ans,0)if flag==0:return self.get_max(nums)if last<=len(nums)-1:ans=max(ans,self.get_max(nums[last:len(nums)]))return ansdef maxProduct(self, nums):return self.get_max_sum(nums)

http://www.ppmy.cn/news/63502.html

相关文章

【Android入门到项目实战-- 9.4】—— 方向传感器的详细使用教程

目录 一、基础知识 二、实战使用 一、基础知识 Android的方向传感器&#xff0c;返回三轴的角度数据&#xff0c;方向数据的单位是角度。 提供三个数据&#xff1a;azimuth、pitch和roll。 azimuth&#xff1a;方位&#xff0c;返回水平时磁北极和Y轴的夹角&#xff0c;范围是…

C高级 数据结构 树的概念和性质 5.6

数据结构 双向循环链表 循环链表 单链表只能往后查找 循环链表可以通过遍历找到前面的元素 做遍历时可能比单链表效率更高 双向链表 可以往前找&#xff0c;不需要循环一次 如何判断链表是否有环 快慢指针 单链表如何逆序 1.使用一个指针指向头结点后序的结点 2.断开头节点和第…

真题详解(构造二叉树)-软件设计(六十八)

真题详解&#xff08;归纳法&#xff09;-软件设计&#xff08;六十七)https://blog.csdn.net/ke1ying/article/details/130517187 CMM能力成熟模型 CL0(未完成)&#xff1a;过程域未执行或未得到定义的目标。 CL1(已执行)&#xff1a;将可标识的输入工作产品转换成可标识的…

为什么ChatGPT用强化学习而非监督学习?

为什么ChatGPT非得用强化学习&#xff0c;而不直接用监督学习&#xff1f;原因不是那么显而易见。在上周发布的《John Schulman&#xff1a;通往TruthGPT之路》一文中&#xff0c;OpenAI联合创始人、ChatGPT主要负责人John Schulman分享了OpenAI在人类反馈的强化学习&#xff0…

【云原生网关】apisix使用详解

目录 一、apisix介绍 1.1 apisix是什么 二、apisix特点 2.1 多平台支持 2.2 全动态能力

RK3229 android9.0 按刷机按键进入loader

RK3288/RK3399启动后有三种模式:normal模式、 loader模式、MASKROM模式 normal模式:正常的启动模式,这个模式无法刷固件。 一般板子通电就是这个模式。 loader模式:刷固件模式,这个模式可以刷各种image。 按住recover按键再通电,通过bootloader/uboot的检测进入这个模式 …

java中的Random类用法

package com.test.test03;import java.util.Random;public class Test02 {//这是一个main方法&#xff0c;是程序的入口public static void main(String[] args) {//random()返回带正号的double值&#xff0c;该值大于等于0.0且小于1.0System.out.println("随机数&#xf…

PbootCMS Sqlite数据库转Mysql数据库教程 sqlite转mysql

PbootCMS默认采用的是Sqlite数据库,系统自带完整后台以及一套响应式模板,放入PHP(5.3+)环境即可直接使用 线上搭建简易环境为:Apache 、 PHP5.6-PHP7.3 、 Mysql5.5+ 所以如果已经上线一段时间了,网站已经有较多内容后要想换成Mysql版本是很不方便的,以下就是快速将Mys…