leetcode 152. 乘积最大子数组

这篇具有很好参考价值的文章主要介绍了leetcode 152. 乘积最大子数组。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目链接: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个奇数,它可以选择该区间内第一个奇数及其左边部分,也可以选择最后一个奇数及其右边部分。但这道题目需要注意一些边界特殊条件。文章来源地址https://www.toymoban.com/news/detail-438523.html

4.代码

class Solution(object):
    def get_qz_j(self,nums):
        qz,res=[],1
        for i in nums:
            res*=i
            qz.append(res)
        return qz
    def get_qz_fs(self,nums):
        res,qz_fs=1,0
        for i in nums:
            res*=i
            if i<0:
                return res
        return 1
    def get_hz_fs(self,nums):
        res=1
        for i in range(len(nums)-1,-1,-1):
            res*=nums[i]
            if nums[i]<0:
                return res
        return 1
    def 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),1
        ans=qz_j[len(nums)-1]
        cnt,id1=0,0
        for i in range(len(nums)):
            if nums[i] <0:
                cnt+=1
                id1=i
        if cnt%2==0:
            return ans
        if 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 ans
    def get_max_sum(self,nums):
        flag,ans,last=0,-1000000000,0
        for i in range(len(nums)):
            if nums[i]==0:
                flag=1
                if i!=last:
                    ans=max(ans,self.get_max(nums[last:i]))
                last=i+1
                ans=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 ans
    def maxProduct(self, nums):
        return self.get_max_sum(nums)

到了这里,关于leetcode 152. 乘积最大子数组的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 动态规划之连续乘积最大子数组 & 连续和最大子数组

    给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组 是数组中的一个连续部分。 示例 1: 输入:nums = [-2,1,-3,4,-1,2,1,-5,4] 输出:6 解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。 示例 2: 输入:nums = [1] 输出:

    2024年02月10日
    浏览(47)
  • 乘积最大子数组--动态规划

    乘积最大子数组 思路: 看到这个题的时候 要用DP的想法去做这道题 想到遍历到前面的值能不能为后面所用 假设有n个值 我们可以记录一下 第i个值的最大值是什么 怎么用到前面的值取判断 第i个值 可能正数 也可能是负数 如果是正数 那么我们乘以后面第i-1位的最大值 可以得

    2024年02月11日
    浏览(42)
  • Leetcode 628. 三个数的最大乘积

    原题链接:Leetcode 628. Maximum Product of Three Numbers Given an integer array nums , find three numbers whose product is maximum and return the maximum product. Example 1: Example 2: Example 3: Constraints: 3 = nums.length = 10 4 -1000 = nums[i] = 1000 给一个数组,要求返回数组任意三个数的乘积中最大的那个 思路: 首先要明确

    2024年01月21日
    浏览(76)
  • 【动态规划】NK刷题之DP7 连续子数组的最大乘积

    ❤️博客主页: 小镇敲码人 🍏 欢迎关注:👍点赞 👂🏽留言 😍收藏 🌞在一切变好之前,我们总要经历一些不开心的日子,这段日子也许很长,也许只是一觉醒来。有时候,选择快乐,更需要勇气。 🍉 如果你也迷失在了路上,对人生充满了迷惘,不要害怕,冷静下来,

    2024年02月08日
    浏览(51)
  • leetcode238:除自身以外数组的乘积

    在leetcode上刷到了这一题,一开始并没有想到好的解题思路,写篇博客再来梳理一下吧。 题目要求: 不使用除法 在O(n)时间复杂度内 该方法分以下几步: 先遍历数组,求数组所有元素的乘积sum 再遍历一遍数组,使用sum除以该下标对应的元素,将结果放在answer数组中 相较于第

    2024年01月16日
    浏览(47)
  • 【Leetcode】238.除自身以外数组的乘积

    给你一个整数数组 nums ,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums 之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法 ,且在 O(n) 时间复杂度内完成此题。 示例1: 示例2: 提示:

    2024年01月22日
    浏览(39)
  • 【LeetCode: 238. 除自身以外数组的乘积 +前缀后缀】

    🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,CSDN-Java领域优质创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文

    2024年01月20日
    浏览(83)
  • 【LeetCode-中等题】238. 除自身以外数组的乘积

    双指针暴力查找(需考虑begin == end 和begin == end ==i) 的情况 ----- 力扣示例超出时间限制 相比较上面的做法,使用最终答案数组代替其中一个缀积,然后再计算缀积相乘的时候,使用一个累乘变量来记录某一个前缀和,最后只开辟了一个数组来存最终答案,复杂度为O(1)

    2024年02月11日
    浏览(45)
  • Leetcode:238. 除自身以外数组的乘积【题解超详细】

    纯C语言实现(小白也能看明白) 题目 给你一个整数数组  nums ,返回  数组  answer  ,其中  answer[i]  等于  nums  中除  nums[i]  之外其余各元素的乘积  。 题目数据  保证  数组  nums 之中任意元素的全部前缀元素和后缀的乘积都在   32 位  整数范围内。 请 不要使用除

    2024年02月11日
    浏览(35)
  • 【LeetCode】替换空格&&消失的数字&&分割链表&&除自身以外数组的乘积

    ​🌠 作者:@阿亮joy. 🎆 专栏: 《阿亮爱刷题》 🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 请实现一个函数,把字符串 s 中的每个空格替换成\\\"%20\\\"。 示例 1: 输入: s = \\\"We are happy.\\\" 输出: \\\"We%20are%2

    2024年02月22日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包