8.贪心算法
文章平均质量分 63
代码随想录贪心算法学习
pig不会cv
这个作者很懒,什么都没留下…
展开
-
8.16单调递增的数字(LC738-M)
拿一个两位的数字来举例。例如:98,一旦出现strNum[i - 1] > strNum[i]的情况(非单调递增),首先想让strNum[i - 1]--,然后strNum[i]给为9,这样这个整数就是89,即小于98的最大的单调递增整数。此时是从前向后遍历还是从后向前遍历呢?举个例子,数字:332:若从前向后遍历:那么就变成了329,此时2又小于了第一位的3了,真正的结果应该是299。若从后向前遍历:332的数值变化为:332 -> 329 -> 299。原创 2024-01-27 10:07:48 · 319 阅读 · 0 评论 -
8.15合并区间(LC56)
如果我们在循环内部添加,那么当循环结束时,最后一个合并的区间将被忽略。原创 2024-01-27 09:30:58 · 536 阅读 · 0 评论 -
8.14划分字母区间(LC763-M)(附.length,.length(),.size()使用原理)
在遍历的过程中相当于是要找每一个字母的边界,。此时前面出现过所有字母,最远也就到这个边界了。原创 2024-01-27 08:42:20 · 379 阅读 · 0 评论 -
8.13无重叠区间(LC435-M)
此时问题就变成:求非交叉区间的最大个数。区间,1,2,3,4,5,6都按照右边界排好序。当确定区间 1 和 区间2 重叠后,如何确定是否与 区间3 也重贴呢?就是取 区间1 和 区间2 右边界的最小值,因为这个最小值之前的部分一定是 区间1 和区间2 的重合部分,原创 2024-01-26 11:16:38 · 459 阅读 · 0 评论 -
8.12用最少数量的箭引爆气球(LC452-M)
可以看出首先第一组重叠气球,一定是需要一个箭,气球3,的左边界大于了 第一组重叠气球的最小右边界,所以再需要一支箭来射气球3了。以题目示例: [[10,16],[2,8],[1,6],[7,12]]为例。java所使用的内置函数用的是快速排序需要 logn 的空间。局部最优:当气球出现重叠,一起射,所用弓箭最少。是比较这两个元素的第一个值的大小。排序需要 O(nlogn) 的复杂度。方法默认是按照升序进行排序的。分别代表数组中的两个元素,个元素的第一个值,而。Lambda 表达式。按照数组中每个元素的。原创 2024-01-26 10:47:15 · 437 阅读 · 0 评论 -
8.11根据身高重建队列(LC406-M)
a和b代表了people数组中的两个元素,每个元素都是一个一维数组,表示一个人的身高和前面的人数。a[0]表示第一个人的身高,a[1]表示第一个人的前面人数。b[0]表示第二个人的身高,b[1]表示第二个人的前面人数。因此,中的比较逻辑根据这些元素的身高和前面的人数进行排序。如果a和b的身高相同(),则表示根据前面的人数升序排列。( a - b 是升序)如果a和b的身高不同,则表示根据身高降序排列。( b - a 是降序)原创 2024-01-26 09:35:30 · 1411 阅读 · 0 评论 -
8.10柠檬水找零(LC860-E)
只需要维护三种金额的数量,5,10和20。此时大家就发现 情况一,情况二,都是固定策略,都不用我们来做分析了,而唯一不确定的其实在情况三。账单是20的情况,为什么要优先消耗一个10和一个5呢?遇到账单20,优先消耗美元10,完成本次找零。完成全部账单的找零。原创 2024-01-26 08:30:09 · 250 阅读 · 0 评论 -
8.9分发糖果(LC135-H)
这道题目一定是要确定一边之后,再确定另一边,例如比较每一个孩子的左边,然后再比较右边,。原创 2024-01-25 12:08:11 · 382 阅读 · 0 评论 -
8.8加油站(LC134-M)
首先如果总油量减去总消耗大于等于零那么一定可以跑完一圈,每个加油站的剩余量rest[i]为gas[i] - cost[i]。说明 各个站点的加油站 剩油量rest[i]相加一定是大于等于零的。i从0开始累加rest[i],和记为curSum,一旦curSum小于零,说明[0, i]区间都不能作为起始位置,因为这个区间选择任何一个位置作为起点,到i这里都会断油,那么起始位置从i+1算起,再从0计算curSum。。原创 2024-01-25 10:54:48 · 398 阅读 · 0 评论 -
8.7K次取反后最大化的数组和(LC1005-E)
局部最优:只找数值最小的正整数进行反转,当前数值和可以达到最大(例如正整数数组{5, 3, 1},反转1 得到-1 比 反转5得到的-5 大多了)这意味着,元素的绝对值较大的会排在前面。1.这段代码使用了Java中的流式操作(Stream API)来对整数数组进行一系列操作。若k为偶数,正确的算法会反复取反同一个数 偶数次,相当于没有取反,所以无需再操作。局部最优:让绝对值大的负数变为正数,当前数值达到最大。对象,这是Java中用于表示一系列整数的流。中的每个元素都装箱为对应的包装类型。原创 2024-01-25 09:39:57 · 461 阅读 · 0 评论 -
8.6跳跃游戏②(LC45-M)
与上一题一样,还是看覆盖范围以最小的步数增加覆盖范围,覆盖范围一旦覆盖了终点,得到的就是最少步数!。如果移动下标达到了当前这一步的最大覆盖最远距离了,还没有到终点的话,那么就必须再走一步来增加覆盖范围,直到覆盖范围覆盖了终点。原创 2024-01-25 08:49:16 · 535 阅读 · 0 评论 -
8.5跳跃游戏(LC55-M)
其实跳几步无所谓,关键在于可跳的覆盖范围!不一定非要明确一次究竟跳几步,每次取最大的跳跃步数,这个就是可以跳跃的覆盖范围。这个范围内,别管是怎么跳的,反正一定可以跳过来。那么这个问题就转化为跳跃覆盖范围究竟可不可以覆盖到终点!每次移动取最大跳跃步数(得到最大的覆盖范围),每移动一个单位,就更新最大覆盖范围。局部最优:每次取最大跳跃步数(取最大覆盖范围)整体最优解:最后得到整体最大覆盖范围,看是否能到终点。时间空间复杂度:时间复杂度:O(n),其中 n为数组的大小。只需要访问 nums 数组一遍,共原创 2024-01-22 16:55:10 · 497 阅读 · 0 评论 -
8.4买卖股票的最佳时机(LC122-M)
相当于(prices[3] - prices[2]) + (prices[2] - prices[1]) + (prices[1] - prices[0])。假如第 0 天买入,第 3 天卖出,那么利润为:prices[3] - prices[0]。时间复杂度:O(n),其中 n 为数组的长度。我们只需要遍历一次数组即可。空间复杂度:O(1)。只需要常数空间存放若干变量。原创 2024-01-22 16:34:36 · 418 阅读 · 0 评论 -
8.3最大子序和(LC53-M)
(-2+1,起点为负数,加上后面的数,只会让和变小;不如让1变成新的起点,再往后求和)一定是从 1 开始计算,因为负数只会拉低总和,这就是贪心贪的地方!局部最优:当前“连续和”为负数的时候立刻放弃,从下一个元素。,因为负数加上下一个元素 “连续和”只会越来越小。如果 -2 1 在一起,计算起点的时候,全局最优:选取最大“连续和”MIN_VALUE全部大写。原创 2024-01-21 12:51:23 · 358 阅读 · 0 评论 -
8.2摆动序列(LC376-M)
情况一:上下坡中有平坡情况二:数组首尾两端(统计峰值的时候,数组最左面和最右面如何统计呢?题目中说了,如果只有两个不同的元素,那摆动序列也是 2。情况三:单调坡中有平坡。原创 2024-01-20 11:51:26 · 938 阅读 · 0 评论 -
8.1分发饼干(LC455-E)
局部最优:大尺寸的饼干既可以满足胃口大的孩子也可以满足胃口小的孩子,那么就应该优先满足胃口大的。。原创 2024-01-06 21:18:36 · 365 阅读 · 0 评论