题目 给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。...解答 首先假设存在某个最大乘积,然后对数组遍历,在经过每个元素的时候,有以下四种情况: 如果该元素为正数: 如果到上一个元素为止的最大乘积也是正数,那么直接乘上就好了,同样的最大乘积也会变得更大 如果到上一个元素为止的最大乘积是负数...,那么最大乘积就会变成该元素本身,且连续性被断掉 如果该元素为负数: 如果到上一个元素为止的最大乘积也是负数,那么直接乘上就好了,同样的最大乘积也会变得更大 如果到上一个元素为止的最大乘积是正数,那么最大乘积就会不变...,且连续性被断掉 以上四种情况中说到的最大乘积都是临时最大乘积,每遍历新的元素都需要进行比较来确定真正的最大乘积。...如果要得到乘以当前元素以后的最大乘积,需要记录最大乘积,也要记录最小乘积,因为最小值可能翻身变最大值。
题目: 给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。...输入: [2,3,-2,4] 输出: 6 解释: 子数组 [2,3] 有最大乘积 6。...思路: 遍历数组时计算当前最大值,不断更新 我们需要记录阶段子数组最大值和最小值,当出现负数的时候我们阶段最大值×负数会变成阶段最小值,阶段最小值×负数会变阶段最大值,因此我们需要存储阶段最小值,并且在需要负数的时候进行提取的交换...return nums[0]; } int max=nums[0],itemMax=nums[0],itemMin=nums[0]; //max 存储所有连续子数组最大值...//itemMax,itemMin存储当前子数组最大值和最小值 //其中需要itemMin存最小值主要因为数组里可能有负数,负数最小值再乘以一个整数就是最大值
# LeetCode-152-乘积最大子数组 给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。...示例1: 输入: [2,3,-2,4] 输出: 6 解释: 子数组 [2,3] 有最大乘积 6。...# 解题思路 方法1、动态规划: 遍历数组的时候不断计算当前的最大值 同时还需要记录之前的最小值,当遍历的到的nums[i]为负数的时候 最大值*负数:会导致最大值变为最小 最小值*负数:会导致最小值变为最大...nums[i],nums[i]);计算 最大值和最小值会发生互换,导致结果不对 既然这样当遇到负数nums[i]的时候,提前将最大值和最小值互换,就可以维持原本的最大最小值 一个更好的题解来自https...// dp_max[i] 指的是以第 i 个数结尾的 乘积最大 的连续子序列 // dp_min[i] 指的是以第 i 个数结尾的 乘积最小 的连续子序列
题目描述 解题思路 代码 复杂度分析 GitHub LeetCode 项目 题目描述 题目链接 给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积...示例 1: 输入:[2,3,-2,4] 输出:6 解释:子数组 [2,3] 有最大乘积 6。...解题思路 本题要求的是「乘积最大的子数组」,但是最大的乘积可能是两个正数相乘,也可能是两个负数相乘。定义 pi 为包含 i 的子数组最大乘积,ni 为包含 i 的子数组最小乘积。...则记数组 nums0:i 的最大乘积值为 m: pi = max(pi - 1 numsi, numsi, ni - 1 numsi) ni = min(pi - 1 numsi, numsi,...Java 编程思想-最全思维导图-GitHub 下载链接,需要的小伙伴可以自取~!!!
难度中等963 给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。...示例 1: 输入: [2,3,-2,4] 输出: 6 解释: 子数组 [2,3] 有最大乘积 6。...示例 2: 输入: [-2,0,-1] 输出: 0 解释: 结果不能为 2, 因为 [-2,-1] 不是子数组 标签:动态规划 遍历数组时计算当前最大值,不断更新 令imax为当前最大值,则当前最大值为...imax = max(imax * nums[i], nums[i]) 由于存在负数,那么会导致最大的变最小的,最小的变最大的。
思路 数组中有负有正有0 状态表示 f[i] : 表示从[0, i]数组乘积的最大值 g[i] : 表示从[0, i]数组乘积的最小值 状态计算 通过i-1的状态递推i 对于f[i] f[i]...nums[i] > 0 f[i] = f[i - 1] * nums[i] nums[i] < 0 f[i] = g[i - 1] * nums[i] nums[i] == 0 综上f[i]是上面几种情况的最大值...nums[i] > 0 f[i] = g[i - 1] * nums[i] nums[i] < 0 f[i] = f[i - 1] * nums[i] nums[i] == 0 综上f[i]是上面几种情况的最小值
⭐️⭐️⭐️⭐️ 1 题目描述 给定一个整数数组 nums ,找到一个具有最大乘积的连续子数组(子数组最少包含一个元素),返回其最大乘积。如输入[-2,1,-3]返回1。...求最大和时,转移的重点是在当前元素上加一个整数,否则只保留自身,求最大乘积时,因为有负负得正的因素,因此要考虑当前元素的符号。...如果当前元素是正数,则与一个大数相乘更容易得到一个更大的乘积,如果当前元素是负数,则与一个小数相乘更容易得到一个更大的乘积,所以状态转移时不仅要记录当前元素结尾的最大乘积,还要记录当前元素结尾的最小乘积...第一步,找到中间状态:此处中间状态max_st[i]表示第i个元素结尾的子数组最大乘积,min_st[i]表示第i个元素结尾的子数组最小乘积。...第二步,确定状态转移:当nums[i]为正数,则直接与前一步最大乘积和最小乘积相乘,并与自身比较,实现最大值、最小值的状态转移,否则与前一步最大值相乘并与自身比较得到当前最小值乘积,与前一步最小值相乘并与自身比较得到当前最大值
题目描述 给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。...示例 1: 输入: [2,3,-2,4] 输出: 6 解释: 子数组 [2,3] 有最大乘积 6。...示例 2: 输入: [-2,0,-1] 输出: 0 解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。...; } } return rs; } } 复杂度分析 1、时间复杂度:O(n^2) 2、空间复杂度:O(1) 解题思路二:动态规划 遍历数组时计算当前最大值...,不断更新 令imax为当前最大值,则当前最大值为 imax = max(imax * nums[i], nums[i]) 由于存在负数,那么会导致最大的变最小的,最小的变最大的。
今天和大家聊的问题叫做 乘积最大子数组,我们先来看题面: https://leetcode-cn.com/problems/maximum-product-subarray/ Given an integer...题意 给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。...样例 示例 1: 输入: [2,3,-2,4] 输出: 6 解释: 子数组 [2,3] 有最大乘积 6。...示例 2: 输入: [-2,0,-1] 输出: 0 解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。 解题 思路: 求最大值,可以看成求被0拆分的各个子数组的最大值。...当一个数组中没有0存在,则分为两种情况: 1.负数为偶数个,则整个数组的各个值相乘为最大值; 2.负数为奇数个,则从左边开始,乘到最后一个负数停止有一个“最大值”,从右边也有一个“最大值”,比较,得出最大值
乘积最大子数组 - 力扣(LeetCode) 一、题目详情 给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。...测试用例的答案是一个 32-位 整数。 子数组 是数组的连续子序列。 示例 1: 输入: nums = [2,3,-2,4] 输出: 6 解释: 子数组 [2,3] 有最大乘积 6。...提示: 1 <= nums.length <= 2 * 104 -10 <= nums[i] <= 10 nums 的任何前缀或后缀的乘积都 保证 是一个 32-位 整数 二、算法讲解 题目求解的是乘积...,乘积可以为正,也可以为负,为了区分这两种状态,我们创建两个表: f[i] 表示以i-1位置为结尾时的最大乘积; g[i] 表示以i-1位置为结尾时的最小乘积。...f表和g表的第一个格子空间,为了不干扰后续的结果,初始化为 f[0]=g[0]=1; 返回值则是f表中最大的那一个。
问题描述:给定一个长度为 N 的整数数组,只允许乘法,不能用除法。计算任意 N - 1 个数的组合中乘积最大的一组,并写出算法的时间复杂度。...这道题目和另外一个《连续数组的最大乘积》有点像,那道题我们可以通过记录全局最大值和负数最小值来完成。这道题则稍微有点不同,我们来看一下。...我们假设被排除的 元素索引为 i(0 <= i < N, 且 i 为整数)。 我们用两个数组 l 和 r 分别记录从前和从后的子数组乘积。...我们用 l[i]表示原数组中从 0 开始到 i - 1(包括 i - 1)的乘积, r[i]表示原数组中从 i(包括 i)到 N - 1(包括 N - 1)的乘积。 ?...由于只需要 从有到尾和从尾部到头扫描数组两次即可得到数组l和r,进而可以在线性的时间复杂度获取到所有的乘积,然后在这个过程中我们就可以取出最大值,因此这样做的时间复杂度为O(N)。
本文的内容为通过一道腾讯的面试题,即力扣 152. 乘积最大子数组,由暴力法求解一步一步演化到由动态规划进行求解来介绍动态规划。...题目 给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。...示例 解题思路 注意点 本题要求的是乘积最大的连续子数组而不是乘积最大的子序列,因此要求子数组中的元素在原数组中是连续的。...如果连续子数组中的元素存在负数,正数乘以负数就成负数,那么最大值乘以负数就变成了最小值,因此需要同时考虑当前连续子数组乘积的最大值curMax和最小值curMin。...举栗 以整数数组 nums = [2, 3, -2, 4] 为栗子,求乘积最大子数组的乘积。 如下图示: ?
乘积最大子数组 - 力扣(LeetCode) 要找乘积最大的连续子数组,我们之前做过找和最大的连续子数组【LeetCode热题100】【普通数组】最大子数组和-CSDN博客 对于和来讲,定义dp[i]是以...nums[i]为结尾的最大子数组的和,那么dp[i]要么就是nums[i]加上之前的dp[i-1],即前一个子数组加上当前元素,要么是nums[i]自己新开一个子数组,所以状态转移方程 dp[i] =...std::max(dp[i - 1] + nums[i], nums[i]); 但是乘积与和不一样的地方在于负数的情况,负数加负数的和是越来越小的,但是乘积会因为碰到一个负数变成最大或者变成最小,因此需要用两个数组记录状态...,dpMin记录最小,dpMax记录最大 class Solution { public: int maxProduct(vector &nums) { vector<
乘积最大子数组 链接:https://leetcode-cn.com/problems/maximum-product-subarray 给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组...(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。...示例 1: 输入: [2,3,-2,4] 输出: 6 解释: 子数组 [2,3] 有最大乘积 6。...neg_dp * n) 找到最大的pos_dp,就是满足条件的解。...如果时间不够,以后的更新会总结打卡群的题。
题目 给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。...image.png 解题思路 注意点 本题要求的是乘积最大的连续子数组而不是乘积最大的子序列,因此要求子数组中的元素在原数组中是连续的。...只包含一个元素 */ if (size == 1) { return nums[0]; } /* maxRes 记录整数数组 nums 中乘积最大的连续子数组的乘积...如果连续子数组中的元素存在负数,正数乘以负数就成负数,那么最大值乘以负数就变成了最小值,因此需要同时考虑当前连续子数组乘积的最大值curMax和最小值curMin。...举栗 以整数数组 nums = [2, 3, -2, 4] 为栗子,求乘积最大子数组的乘积。
一,数组中两元素的最大乘积 1,问题简述 给你一个整数数组 nums,请你选择数组的两个不同下标 i 和 j,使 (nums[i]-1)*(nums[j]-1) 取得最大值。...请你计算并返回该式的最大值。...2,示例描述 示例 1: 输入:nums = [3,4,5,2] 输出:12 解释:如果选择下标 i=1 和 j=2(下标从 0 开始),则可以获得最大值,(nums[1]-1)*(nums[2]-...示例 2: 输入:nums = [1,5,4,5] 输出:16 解释:选择下标 i=1 和 j=3(下标从 0 开始),则可以获得最大值 (5-1)*(5-1) = 16 。...,计算前后元素的最大乘积,更新最大值 4,题解程序 public class MaxProductTest { public static void main(String[] args) {
题目 给你一个整数数组 nums,请你选择数组的两个不同下标 i 和 j,使 (nums[i]-1)*(nums[j]-1) 取得最大值。 请你计算并返回该式的最大值。...示例 1: 输入:nums = [3,4,5,2] 输出:12 解释:如果选择下标 i=1 和 j=2(下标从 0 开始),则可以获得最大值,(nums[1]-1)*(nums[2]-1) = (4...示例 2: 输入:nums = [1,5,4,5] 输出:16 解释:选择下标 i=1 和 j=3(下标从 0 开始),则可以获得最大值 (5-1)*(5-1) = 16 。
题目 给你一个整数数组 nums,请你选择数组的两个不同下标 i 和 j,使 (nums[i]-1)*(nums[j]-1) 取得最大值。 请你计算并返回该式的最大值。...示例 1: 输入:nums = [3,4,5,2] 输出:12 解释:如果选择下标 i=1 和 j=2(下标从 0 开始), 则可以获得最大值,(nums[1]-1)*(nums[2]-1) = (4...示例 2: 输入:nums = [1,5,4,5] 输出:16 解释:选择下标 i=1 和 j=3(下标从 0 开始), 则可以获得最大值 (5-1)*(5-1) = 16 。...解题 找到数组最大的两个数,排序 O(nlogn) class Solution { public: int maxProduct(vector& nums) { sort
大家好,又见面了,我是你们的朋友全栈君。 给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。...示例 1: 输入: [2,3,-2,4] 输出: 6 解释: 子数组 [2,3] 有最大乘积 6。...示例 2: 输入: [-2,0,-1] 输出: 0 解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。
题目 给你一个整数数组 nums,请你选择数组的两个不同下标 i 和 j,使 (numsi-1)*(numsj-1) 取得最大值。 请你计算并返回该式的最大值。...示例 1: 输入:nums = [3,4,5,2] 输出:12 解释:如果选择下标 i=1 和 j=2(下标从 0 开始),则可以获得最大值,(nums[1]-1)*(nums[2]-1) = (4...示例 2: 输入:nums = [1,5,4,5] 输出:16 解释:选择下标 i=1 和 j=3(下标从 0 开始),则可以获得最大值 (5-1)*(5-1) = 16 。
领取专属 10元无门槛券
手把手带您无忧上云