leetcode贪心系列
# leetcode贪心系列
谜底666
我迷恋的时光自天空倾倒
展开
-
763 划分字符区间
贪心的解法,首先题目中说了,同一个字母要出现在一个片段中,那么就要想到需要先遍历一遍字符串,得到每个字母的最后一个位置。像 “ababcbacadefegde”, “hijhklij” 这样的划分是错误的,因为划分的片段数较少。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。划分结果为 “ababcbaca”、“defegde”、“hijhklij”。注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s。返回一个表示每个字符串片段的长度的列表。原创 2024-06-21 09:03:18 · 207 阅读 · 0 评论 -
leetcode45 跳跃游戏II
在遍历数组的时候,不必要访问数组的最后一个元素,因为题目保证了一定能跳到最后一个位置,那我们在访问最后一个元素的时候,我们的边界一定是大于等于最后一个元素。如果访问最后一个元素,在边界恰好为最后一个位置的情况下,会增加一次次数(解释的是下面代码中i < n-1的逻辑)。举个例子:2,3,1,1,4 这个数组,开始的时候2可以跳到3或1的位置,假如跳到3,则又可以直接跳到终点,只需要两步即可;从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。初始位置为 nums[0]。原创 2024-06-20 22:15:23 · 359 阅读 · 0 评论 -
leetcode系列贪心算法汇总
解析:这道题的解法很是巧妙,先要根据身高维度降序排,身高相等时根据k增序排,此时得到了一个中间态的结果,在此基础上进行遍历,根据每一个的k要在的相对位置进行不断的插入操作,巧妙的点就在于这种操作并不会影响之前已经排过的位置,因为身高是降序的,k是增序的。从左往右更新max的时候,会先被更新成6,遇到4的时候发现逆序了,把4更新成右边界,继续遇到8了更新成max,遇到10了更新成max,遇到9了,逆序,记录9为右边界,之后max更新成15。所以无序的区间就是从6到9的部分。原创 2023-09-26 08:21:27 · 286 阅读 · 0 评论 -
leetcode406 根据身高重建队列
编号为 4 的人身高为 4 ,有 4 个身高更高或者相同的人排在他前面,即编号为 0、1、2、3 的人。因此 [[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]] 是重新构造后的队列。输入:people = [[7,0],[4,4],[7,1],[5,0],[6,1],[5,2]]编号为 5 的人身高为 7 ,有 1 个身高更高或者相同的人排在他前面,即编号为 1 的人。输出:[[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]]原创 2023-09-25 18:53:06 · 138 阅读 · 0 评论 -
leetcode621 任务调度器
任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时间内执行完。因为要求两个相同的任务之间要有时间为n的空窗,所以我们要先找到次数最多的任务,然后将其余的任务都放在空窗期,这样就比较省时间,要是都分配完了,就是图中的「冷却」。然而,两个 相同种类 的任务之间必须有长度为整数 n 的冷却时间,因此至少有连续 n 个单位时间内 CPU 在执行不同的任务,或者在待命状态。在本示例中,两个相同类型任务之间必须间隔长度为 n = 2 的冷却时间,而执行一个任务只需要一个单位时间,所以中间出现了(待命)状态。原创 2023-09-25 15:44:23 · 166 阅读 · 0 评论 -
leetcode581 最短无序连续子数组
上面这个方法当然不是最好的解法,但各种题解说的云里雾里的,看了好长时间,还是再整理下好的解法。从左往右的话,应该是递增对吧,那么先设定的叫tmpMax的最大值,符合递增就不断更新最大值,直到不满足递增了,说明这个数字不对,需要重新排序,先记录下下标;这道题目的意思就是,将一个数组分为3部分,最前面的部分是升序的,最后面的部分是降序的,中间可能乱序,把中间的排一下,使得整体有序就可以了。给你一个整数数组 nums ,你需要找出一个 连续子数组 ,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。原创 2023-09-25 08:57:48 · 88 阅读 · 0 评论 -
相向双指针 leetcode11 盛水最多的容器
主要还是得理解了题意才行,要求的是最大容器,其实也就是最大的面积,那求面积的话,其实就是宽乘以高,宽就是双指针下标之间的距离;高就是双指针中高度较小的那个,理解了这个后,这道题目就不难了。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i])解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。这里可以注意下,如果用的是go 1.21后面的版本,就不需要自己定义max和min了,只用用就行。输入:[1,8,6,2,5,4,8,3,7]原创 2023-09-22 16:12:37 · 270 阅读 · 0 评论 -
leetcode1414 和为K的最少斐波那契数字数目 middle
题目:给你数字 k ,请你返回和为 k 的斐波那契数字的最少数目,其中,每个斐波那契数字都可以被使用多次。斐波那契数字定义为:F1 = 1F2 = 1Fn = Fn-1 + Fn-2, 其中 n > 2 。数据保证对于给定的 k,一定能找到可行解。示例:输入:k = 7输出:2 解释:斐波那契数字为:1,1,2,3,5,8,13,……对于 k = 7 ,我们可以得到 2 + 5 = 7 。解析:贪心算法:首先找到所有不超过 k的斐波那契数字,然后每...原创 2022-02-04 10:43:00 · 365 阅读 · 0 评论 -
leetcode55 跳跃游戏
给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标。输入:nums = [2,3,1,1,4]输出:true解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。还是只说贪心算法;数组中每个下标的value,代表的是从该位置可以跳跃的最大长度,比如等于3的话,可以选择跳1步、2步、3步;我们其实并不需要关心它跳几步,而是它可跳的最大覆盖范围,覆盖了终点,那就可以返原创 2022-12-05 10:27:15 · 397 阅读 · 0 评论 -
leetcode122 买卖股票的最佳时机II
这道题还是只用贪心算法的话,要求整体的最大利润,相当于分解成各个小的利润的和,当天买入再卖出的价钱是一样的,当然没利润,要两天才会产生利润;此时两天的利润可能是正的也可能是负的,那么我们把可以加的正的都加起来就是最大利润。解释:在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4。随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6 - 3 = 3。原创 2022-12-02 10:14:16 · 103 阅读 · 0 评论 -
leetcode 376 摆动序列
相反,[1, 4, 7, 2, 5] 和 [1, 7, 4, 5, 5] 不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。例如, [1, 7, 4, 9, 2, 5] 是一个 摆动序列 ,因为差值 (6, -3, 5, -7, 3) 是正负交替出现的。如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为 摆动序列。解释:整个序列均为摆动序列,各元素之间的差值为 (6, -3, 5, -7, 3)输入:nums = [1,7,4,9,2,5]原创 2022-12-01 22:35:54 · 275 阅读 · 0 评论 -
leetcode 455 分发饼干
对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。虽然你有两块小饼干,由于他们的尺寸都是1,你只能让胃口值是1的孩子满足。你有三个孩子和两块小饼干,3个孩子的胃口值分别是:1,2,3。输入: g = [1,2,3], s = [1,1]原创 2022-12-01 22:05:42 · 394 阅读 · 0 评论