首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

乘积大子数组

解答 首先假设存在某个最大乘积,然后对数组遍历,在经过每个元素的时候,有以下四种情况: 如果该元素为正数: 如果到上一个元素为止的最大乘积也是正数,那么直接乘上就好了,同样的最大乘积也会变得更大 如果到上一个元素为止的最大乘积是负数...,那么最大乘积就会变成该元素本身,且连续性被断掉 如果该元素为负数: 如果到上一个元素为止的最大乘积也是负数,那么直接乘上就好了,同样的最大乘积也会变得更大 如果到上一个元素为止的最大乘积是正数,那么最大乘积就会不变...,且连续性被断掉 以上四种情况中说到的最大乘积都是临时最大乘积,每遍历新的元素都需要进行比较来确定真正的最大乘积。...如果要得到乘以当前元素以后的最大乘积,需要记录最大乘积,也要记录最小乘积,因为最小值可能翻身变最大值。...nums[i], nums[i]); res = max(res, max_val); } return res; } }; 另外,该题最长子序列的问题颇为相似

45420

【leetcode刷题】T16-乘积大子序列

这是木又陪伴你的第26天 今天分享leetcode第16篇文章,也是leetcode第152题—乘积大子序列(Maximum Product Subarray),地址是:https://leetcode.com...【中文题目】 给定一个整数数组 nums ,找出一个序列乘积最大的连续子序列(该序列至少包含一个数)。...【思路】 如果你明白昨天的分享「最大子数组和」:使用变量存储到当前元素为止的子序列的最大和,递推公式为:dp = max(dp+num, num) 那么同理可以使用变量存储到当前元素为止的子序列的最大乘积...是的,当num>=0,上诉递推公式是没问题的 但是当num<0时,应该在 到前一个元素为止的子序列最小乘积*num 和num中选择最大值 总结来说,tmp_max表示到前一个元素为止的子序列最大乘积;...tmp_min表示到前一个元素为止的子序列最小乘积,那么tmp_max = max(tmp_max*num, tmp_min*num, num),tmp_min = min(tmp_max*num, tmp_min

48210

大子序列

int maxRightSum = maxSumRec(a, center + 1, end);//2.右半最大子序列和 /* 3.如果最大子序列和贯穿左右时:...|--- 1.子序列是连续的 |--- 2.中点和中点的后面元素在最大子序列中 */ //寻找左半中含左半一个元素的最大子序列和 int maxLeftSBorderSum...= 0, leftBorderSum = 0; for (int i = center; i >= start; i--) {//遍历包含center点的侧子序列取最大和 leftBorderSum...: -2 11 -4 的最大子序列和 |---Q1.2: 13 -5 -2 的最大子序列和 |---Q1.3: 序列和最大值贯穿左右时的最大值: |--- 判断左半:序列含左半最后一个元素的子序列最大值...|---Q1.1.2: -4 的最大子序列和 -4 |---Q1.1.3: 序列和最大值贯穿左右时的最大值: |--- 判断左半:序列含左半最后一个元素的子序列最大值 11

42130

LeetCode刷题DAY 20:乘积大子数组

⭐️⭐️⭐️⭐️ 1 题目描述 给定一个整数数组 nums ,找到一个具有最大乘积的连续子数组(子数组最少包含一个元素),返回其最大乘积。如输入[-2,1,-3]返回1。...2 题解 思路:动态规划 本题主要思想与LeetCode刷题DAY 19:最大子序和比较类似,只是在状态转移时要考虑数学计算方面的特殊性。...如果当前元素是正数,则与一个大数相乘更容易得到一个更大的乘积,如果当前元素是负数,则与一个小数相乘更容易得到一个更大的乘积,所以状态转移时不仅要记录当前元素结尾的最大乘积,还要记录当前元素结尾的最小乘积...第一步,找到中间状态:此处中间状态max_st[i]表示第i个元素结尾的子数组最大乘积,min_st[i]表示第i个元素结尾的子数组最小乘积。...第二步,确定状态转移:当nums[i]为正数,则直接与前一步最大乘积和最小乘积相乘,并与自身比较,实现最大值、最小值的状态转移,否则与前一步最大值相乘并与自身比较得到当前最小值乘积,与前一步最小值相乘并与自身比较得到当前最大值

63120

dp算法 力扣152乘积大子数组

乘积大子数组 - 力扣(LeetCode) 一、题目详情 给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。...子数组 是数组的连续子序列。 示例 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位置为结尾时的最小乘积

13820
领券