152乘积最大子序列

题目:给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)。

来源:https://leetcode-cn.com/problems/maximum-product-subarray/

法一:别人代码

思路:由于想用动态规划解题,通过观察数字可以发现从nums[i]到nums[i+1]的最大值之间的关系,由于有负数的存在,最大值可能直接转化为最小值,所以为了无后效性,直接把前面的最大值和最小值保存了,每次乘完后再比较。

class Solution:
    def maxProduct(self, nums: List[int]) -> int:
        if not nums: return
        res = nums[0]
        pre_max = nums[0]
        pre_min = nums[0]
        for num in nums[1:]:
            cur_max = max(pre_max * num, pre_min * num, num)
            cur_min = min(pre_max * num, pre_min * num, num)
            # 注意这里的最大值要另外求
            res = max(res, cur_max)
            pre_max = cur_max
            pre_min = cur_min
        return res
if __name__ == ‘__main__‘:
    duixiang = Solution()
    # a = duixiang.maxProduct([2,3,-2,4,-9])
    # a = duixiang.maxProduct([2, 3, -2, 4])
    # b = [2,-5,-2,-4,3]
    # # b.reverse()
    # a = duixiang.maxProduct(b)
    # b = [1, -2, 0, 1, -4, 1, 1, 5, 4, -1, 6, 4, 1, -5, 0, -1, -5, 1, -6, -4]
    b = [3, -2, -3, -3, 1, 3, 0]
    b = [-1,-2,-9,-6]
    # b.reverse()
    a = duixiang.maxProduct(b)
    print(a)

法二:利用负数的奇偶解题

原文地址:https://www.cnblogs.com/xxswkl/p/12306760.html

时间: 2024-10-13 14:49:12

152乘积最大子序列的相关文章

LeetCode 152. 乘积最大子序列

给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数). 示例 1: 输入: [2,3,-2,4] 输出: 6 解释: 子数组 [2,3] 有最大乘积 6. 示例 2: 输入: [-2,0,-1] 输出: 0 解释: 结果不能为 2, 因为 [-2,-1] 不是子数组. 直接暴力求解 1 class Solution { 2 public int maxProduct(int[] nums) { 3 int i, j; 4 int max = -65535; 5

[LeetCode]152. 乘积最大子序列(DP)

题目 给定一个整数数组 nums?,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数). 示例 1: 输入: [2,3,-2,4] 输出: 6 解释:?子数组 [2,3] 有最大乘积 6. 示例 2: 输入: [-2,0,-1] 输出: 0 解释:?结果不能为 2, 因为 [-2,-1] 不是子数组. 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/maximum-product-subarray 著作权归领扣网络所有.商业转载请联

LeetCode——152. 乘积最大子序列

给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数). 示例 1: 输入: [2,3,-2,4] 输出: 6 解释: 子数组 [2,3] 有最大乘积 6. 示例 2: 输入: [-2,0,-1] 输出: 0 解释: 结果不能为 2, 因为 [-2,-1] 不是子数组. https://leetcode-cn.com/problems/maximum-product-subarray/ 动态规划 其实这道题最直接的方法就是用 DP 来做,而且要用两个 dp 数组

152 Maximum Product Subarray 乘积最大子序列

找出一个序列中乘积最大的连续子序列(该序列至少包含一个数).例如, 给定序列 [2,3,-2,4],其中乘积最大的子序列为 [2,3] 其乘积为 6.详见:https://leetcode.com/problems/maximum-product-subarray/description/ 方法一: class Solution { public: int maxProduct(vector<int>& nums) { int size=nums.size(); if(size==0|

(Java) LeetCode 152. Maximum Product Subarray —— 乘积最大子序列

Given an integer array nums, find the contiguous subarray within an array (containing at least one number) which has the largest product. Example 1: Input: [2,3,-2,4] Output: 6 Explanation: [2,3] has the largest product 6. Example 2: Input: [-2,0,-1]

第152题:乘积最大子序列

一. 问题描述 给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数). 示例 1: 输入: [2,3,-2,4] 输出: 6 解释: 子数组 [2,3] 有最大乘积 6. 示例 2: 输入: [-2,0,-1] 输出: 0 解释: 结果不能为 2, 因为 [-2,-1] 不是子数组. 二. 解题思路 本题思路:采用动态规划的方法进行求解,找到最优子函数f(n)=max(f(n-1)*m(n),m(n)),其中f(n)代表前n的数中最大值,m(n)代表第n个数的

乘积最大子序列

找出一个序列中乘积最大的连续子序列(至少包含一个数). 样例 比如, 序列 [2,3,-2,4] 中乘积最大的子序列为 [2,3] ,其乘积为6. 思路:想到以什么结尾这种模式.以i结尾的情况下子数组的最大乘积,有三种情况: 1.等于 以i-1结尾的情况下子数组的最小乘积*当前数(这是针对负数乘负数的情况) 2.等于 以i-1结尾的情况下子数组的最大乘积*当前数(这是针对正数乘正数的情况) 3.等于 当前数(比如 当前数的前一个数是0等情况) 取这三种情况的最大值为当前位置能乘出来的的最大值 这

乘积最大子序列 Maximum Product Subarray

[抄题]: 找出一个序列中乘积最大的连续子序列(至少包含一个数). 比如, 序列 [2,3,-2,4] 中乘积最大的子序列为 [2,3] ,其乘积为6. [暴力解法]: 时间分析:每次j循环时都要再循环i找起点,直接用global[i - 1]存起来表示前i个元素,就不用找(且只存到i - 1) 空间分析: [思维问题]: [一句话思路]: [输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入): [画图]: [一刷]: [二刷]: [三刷]: [四刷]:

leetcode152. 乘积最大子序列

给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数). 示例 1: 输入: [2,3,-2,4]输出: 6解释: 子数组 [2,3] 有最大乘积 6. 示例 2: 输入: [-2,0,-1]输出: 0解释: 结果不能为 2, 因为 [-2,-1] 不是子数组. 来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/maximum-product-subarray著作权归领扣网络所有.商业转载请联系官方授权,非商业