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

    leetcode 907子数组的最小值之和题解

    leetcode907 子数组的最小值之和 一道涉及到单调栈的应用的题目 题目如下 给定一个整数数组 A,找到 min(B) 的总和,其中 B 的范围为 A 的每个(连续)子数组。...输入:[3,1,2,4] 输出:17 解释: 子数组为 [3],[1],[2],[4],[3,1],[1,2],[2,4],[3,1,2],[1,2,4],[3,1,2,4]。...最小值为 3,1,2,4,1,1,2,1,1,1,和为 17 思路分析:这里是求出子数组的最小值之和,其实并不需要知道这个子数组的除了最大值之外其它数值。...也就是说,遍历数组的每一个值,找出以该数组为最小值的组合次数,乘积求和为和即可。...例如以[3,1,2,4]的2为例子,则a=2 x=2 y=3,所以次数3-2+1+(3-2)*(2-2) = 2 所以这个题目就变成了,找出对于数组中每一个值,它的前继小于自己的下标/后继小于等于自己的下标

    1.4K10

    长度为 K 的无重复字符子串(滑动窗口)

    题目 给你一个字符串 S,找出所有长度为 K 且不含重复字符的子串,请你返回全部满足要求的子串的 数目。...示例 1: 输入:S = "havefunonleetcode", K = 5 输出:6 解释: 这里有 6 个满足题意的子串,分别是: 'havef','avefu','vefun','efuno',...示例 2: 输入:S = "home", K = 5 输出:0 解释: 注意:K 可能会大于 S 的长度。在这种情况下,就无法找到任何长度为 K 的子串。...提示: 1 <= S.length <= 10^4 S 中的所有字符均为小写英文字母 1 <= K <= 10^4 来源:力扣(LeetCode) 链接:https://leetcode-cn.com...set.size() >= K || set.count(S[j])) set.erase(S[i++]);//长度大了,或者包含j字符 set.insert(S[j]);//j无重复了

    1.7K30

    子数组的最小值之和(单调栈)

    题目 给定一个整数数组 A,找到 min(B) 的总和,其中 B 的范围为 A 的每个(连续)子数组。 由于答案可能很大,因此返回答案模 10^9 + 7。...示例: 输入:[3,1,2,4] 输出:17 解释: 子数组为 [3],[1],[2],[4],[3,1],[1,2],[2,4],[3,1,2],[1,2,4],[3,1,2,4]。...最小值为 3,1,2,4,1,1,2,1,1,1,和为 17。...解题 类似题目:天池 在线编程 所有子数组之和(排列组合) 分别找到每个数作为最小值的左右边界,一边遇到大的停止,一边遇到大于等于的停止 然后左右组合的种数相乘就是 A[i] 的贡献次数 class Solution...s.empty() && A[s.top()] >= A[i]) //两次等号只能取一次 [71,55,82,55],否则答案有重复 s.pop(

    76530

    任意子数组和的绝对值的最大值(贪心)

    一个子数组 [numsl, numsl+1, ..., numsr-1, numsr] 的 和的绝对值 为 abs(numsl + numsl+1 + ... + numsr-1 + numsr) 。...请你找出 nums 中 和的绝对值 最大的任意子数组(可能为空),并返回该 最大值 。 abs(x) 定义如下: 如果 x 是负整数,那么 abs(x) = -x 。...示例 1: 输入:nums = [1,-3,2,3,-4] 输出:5 解释:子数组 [2,3] 和的绝对值最大,为 abs(2+3) = abs(5) = 5 。...思路 子数组绝对值最大等价于子数组最大或者子数组最小。 维护子数组最大:如果当前和为正,则继续加。如果当前和为负,如果继续加等于负数加当前数字,比不上0加当前数字得到的结果大,置和为当前数字。...维护子数组最小:如果当前和为负,则继续加。如果当前和为正,如果继续加等于正数加当前数字,比不上0加当前数字得到的结果小,置和为当前数字。 每次获取最大绝对值即可。

    59710

    每日算法系列【LeetCode 907】子数组的最小值之和

    题目描述 给定一个整数数组 A,找到 min(B) 的总和,其中 B 的范围为 A 的每个(连续)子数组。 由于答案可能很大,因此返回答案模 10^9 + 7。...提示 1 <= A.length <= 30000 1 <= A[i] <= 30000 题解 这题意思是,遍历所有的连续子数组,然后求所有子数组中最小值之和。...对于一个数字 A[i] 来说,如果在某个区间 [j, k] 里面它是最小值,那么 [j, k] 包含 A[i] 的子数组的最小值也一定是 A[i] 。...这里单调栈只需要维护一个单调上升的子序列就行了,遍历到一个数 A[i] 的时候,如果栈顶的元素大于等于 A[i] ,那么就出栈,直到第一个小于 A[i] 的数 A[j] 为止,那么 A[i] 为最小值的区间左端点可选择数量为...也就是从右往左计算右边最远范围的时候,只能计算右边第一个小于等于它的位置,而向左是计算第一个小于它的位置。这样就不会重复计算了。

    1K10

    每日一题三个无重叠子数组的最大和

    做题顺序是这样的:随机选择一题“困难”类型的题目。 因本人ACM退役颇久,代码多有疏漏,望多多见谅。 ---- 题目描述: 给定数组 ? 由正整数组成,找到三个互不重叠的子数组的最大和。...示例输入: [1,2,1,2,6,7,5,1], 2 示例输出: [0, 3, 5] 示例解释: 子数组 [1, 2], [2, 6], [7, 5] 对应的起始索引为 [0, 3, 5]。...当然这题还需要你还原出最大和的情况下,所有子数组的起始元素下标,所以需要另外用一个数组保存一下每一步的最优下标。 同样,假设到第 ? 个元素为止,一共已经产生了 ? 个不重叠数组,用 ?...个子数组的末尾元素下标。 那么按照上面的推断,如果取第 ? 个元素,那么 ? ;否则的话 ? 。 最后就是根据 ? 数组还原答案了。 首先最后一个子数组的末尾元素下标一定是 ?...,那么它的起始元素下标就是 ? ,然后前一个子数组末尾元素下标就是 ?

    71030

    子数组的最小值之和(难度:中等)

    一、题目 给定一个整数数组 arr,找到 min(b) 的总和,其中 b 的范围为 arr 的每个(连续)子数组。 由于答案可能很大,因此 返回答案模 10^9 + 7 。...arr的所有子序列。...那么这个最小值2的总和就是 2 * 6 = 12。问题2:如何计算出包含中心点的子序列个数? 3.2> 问题2:如何计算出包含中心点的子序列个数?...针对问题1,我们可以采用单调栈的方式,因为计算辐射区内的子序列时,是需要通过下标计算的,所以堆栈中存储的是数组arr中元素的下标。...针对上面图例所示,我们已经遍历完所有arr数组中的元素了,并且由于4和3都大于2,所以执行了出栈操作,并分别计算了以4和3为中心点的最小值和分别是:4 和 6。

    38420

    Python算法与数据结构--求所有子数组的和的最大值

    题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 求所有子数组的和的最大值。要求时间复杂度为O(n)。...这个题目有多个解法,比如可以用一个二维数组存之前每个数据的和,然后在进行大小比较;但是这样时间负责度就是O(n2)了。 换个思路思考下,因为是要最大数,那么就不需要存储,只需要找最大值就可以了。...但是为了找子序列的最大和,在遇到相加为负数的情况要跳过,这块注意代码中最后一个if的注释。...基本思路:一个数一个数相加,相加后和最大数以及当前这个数对比,找出最大的;如果相加后是负数,则累加清零 代码----------- # -*- coding: utf-8 -*- """ 题目:输入一个整形数组...数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 求所有子数组的和的最大值。要求时间复杂度为O(n)。

    1.8K20

    leetcode每日一题:689.三个无重叠子数组的最大和

    nums 和一个整数 k ,找出三个长度为 k 、互不重叠、且 3 * k 项的和最大的子数组,并返回这三个子数组。...以下标的数组形式返回结果,数组中的每一项分别指示每个子数组的起始位置(下标从 0 开始)。如果有多个结果,返回字典序最小的一个。...示例 1: 输入:nums = [1,2,1,2,6,7,5,1], k = 2 输出:[0,3,5] 解释:子数组 [1, 2], [2, 6], [7, 5] 对应的起始下标为 [0, 3, 5]。...设 为第一个滑动窗口的元素和,该滑动窗口从 [0,k-1] 开始; 为第二个滑动窗口的元素和,该滑动窗口从[k,2k−1] 开始; 为第三个滑动窗口的元素和,该滑动窗口从[2k,3k−1]...统计这一过程中 + 的最大值及其对应位置。 对于题目要求的最小字典序,由于是从左向右遍历的,并且仅当元素和超过最大元素和时才修改最大元素和,从而保证求出来的下标列表是字典序最小的。

    35520

    子数组最小乘积的最大值(前缀和 + 单调栈)

    请注意,最小乘积的最大值考虑的是取余操作 之前 的结果。 题目保证最小乘积的最大值在 不取余 的情况下可以用 64 位有符号整数 保存。 子数组 定义为一个数组的 连续 部分。...示例 1: 输入:nums = [1,2,3,2] 输出:14 解释:最小乘积的最大值由子数组 [2,3,2] (最小值是 2)得到。 2 * (2+3+2) = 2 * 7 = 14 。...示例 2: 输入:nums = [2,3,3,1,2] 输出:18 解释:最小乘积的最大值由子数组 [3,3] (最小值是 3)得到。 3 * (3+3) = 3 * 6 = 18 。...示例 3: 输入:nums = [3,1,5,6,4,2] 输出:60 解释:最小乘积的最大值由子数组 [5,6,4] (最小值是 4)得到。...解题 为了求子数组的和,需要得到前缀和 为了求以每个数为最小值的子数组的两端的极限位置(数字都大于0,越多越好),可以使用单调栈获取 时间复杂度 O(n) class Solution { public

    75240
    领券