
贪心算法
文章平均质量分 62
贪心算法
hlc@
这个作者很懒,什么都没留下…
展开
-
【贪心】力扣765. 情侣牵手
人和座位由一个整数数组 row 表示,其中 row[i] 是坐在第 i 个座位上的人的 ID。情侣们按顺序编号,第一对是 (0, 1),第二对是 (2, 3),以此类推,最后一对是 (2n-2, 2n-1)。官解使用的是并查集方法,但贪心更加简单高效,将情侣编号变成一样,然后开始两两遍历row,如果row[i]和row[i+1]编号不一样,就去后面的row查找与row[i]相同的编号,然后调换顺序。解释: 只需要交换row[1]和row[2]的位置即可。输入: row = [0,2,1,3]原创 2025-02-24 09:07:40 · 224 阅读 · 0 评论 -
【反悔堆】【hard】力扣871. 最低加油次数
我们遍历每个经过的加油站以及终点,我们用curr和prev来记录相邻两个地方之间的距离,如果油够经过这段距离,我们就不用进行操作,只要将当前加油站油的数量加入到优先队列q中即可。如果油不够经过这段距离,那么我们就需要在之前的加油站进行加油,我们优先在有最多油的加油站加油,也就是q.top(),并且记录ans,直到油够经过这段距离位置。输入:target = 100, startFuel = 10, stations = [[10,60],[20,30],[30,30],[60,40]]地,则返回 -1。原创 2025-01-28 23:00:20 · 500 阅读 · 0 评论 -
【反悔堆】【hard】力扣630. 课程表 III
那么在上一个课程中,m + n是小于上一个课程的结束时间的,由于我们将m替换成比m小的当前课程的天数,而当前课程的结束时间又大于上一个课程的结束时间,所以替换后,一定可以保证不会超过当前课程的结束天数。输入:courses = [[100, 200], [200, 1300], [1000, 1250], [2000, 3200]]第二,修第 3 门课,耗费 1000 天,在第 1100 天完成,在第 1101 天开始下门课程。你的学期从第 1 天开始。输入:courses = [[3,2],[4,3]]原创 2025-01-28 17:49:03 · 460 阅读 · 0 评论 -
【反悔堆】力扣1642. 可以到达的最远建筑
我们模拟从建筑1向建筑n移动,当出现前面建筑更高的时候,就将deltaH放到最小堆q中,如果最小堆里元素数量大于梯子数量,那么我们就弹出最小高差来使用砖块,以保证最高差都是用梯子。输入:heights = [4,12,2,7,3,18,20,3,19], bricks = 10, ladders = 2。输入:heights = [4,2,7,6,9,14,12], bricks = 5, ladders = 1。你从建筑物 0 开始旅程,不断向后面的建筑物移动,期间可能会用到砖块或梯子。原创 2025-01-27 20:35:21 · 575 阅读 · 0 评论 -
【反悔堆】力扣LCP 30. 魔塔游戏
如果当前房间是怪物房间,则将它放到堆中,我们如果受到当前房间效果后生命值不为正,那么就说明我们要将之前的最大怪物伤害的房间放到末尾,所以我们就将最小堆堆顶的值加到hp上,并且ans++代表我们进行了一次调整,然后用delay来储存我们调整到末尾的伤害是多少。当遍历完成后,如果hp += delay不为正数,那么返回-1,否则返回ans。假定小扣原计划按房间编号升序访问所有房间补血/打怪,为保证血量始终为正值,小扣需对房间访问顺序进行调整,每次仅能将一个怪物房间(负数的房间)调整至访问顺序末尾。原创 2025-01-27 19:59:49 · 903 阅读 · 0 评论 -
【贪心】力扣1405. 最长快乐字符串
我们可以使用贪心的算法,我们每次都挑选出最多数量的字符,然后看字符串的最后两个字符和这个字符是否一样,如果一样的话就挑选数量第二多的字符,直到找到合适的字符。如果字符串中不含有任何 ‘aaa’,‘bbb’ 或 ‘ccc’ 这样的字符串作为子串,那么该字符串就是一个「快乐字符串」。s 中 最多 有a 个字母 ‘a’、b 个字母 ‘b’、c 个字母 ‘c’。s 中只含有 ‘a’、‘b’ 、‘c’ 三种字母。输入:a = 1, b = 1, c = 7。输入:a = 2, b = 2, c = 1。原创 2025-01-23 23:52:52 · 174 阅读 · 0 评论 -
【贪心】力扣1953. 你可以工作的最大周数
场景1:m-1>n,即没有足够多的其他任务填充aaaa中的空,所以反过来考虑,将n个其他任务平铺,bbccdd,最多可以在其中插入n+1(左右端点都可以插入)个任务a,由m-1>n知,m>n+1,可以完成目标,此时花费的时间是n+n+1;一旦所有项目中的全部阶段任务都完成,或者执行仅剩的一个阶段任务将会导致你违反上面的规则,你将 停止工作。对于场景2中的情况,我们优先使用阶段最多的任务与阶段第二多的任务交替进行,然后两个任务的阶段数量不断缩减,当。每周,你将会完成 某一个 项目中的 恰好一个 阶段任务。原创 2025-01-22 19:01:26 · 261 阅读 · 0 评论 -
【贪心】力扣984. 不含 AAA 或 BBB 的字符串
谁多用谁,定义一个字符串ans,当a和b都大于0的时候,如果a的数量比b的数量多,ans就加上aab,如果b数量多,ans就加入bba,如果相同,就推入ab。并且都在更新ans后,更新a和b可使用的次数。当a或者b有一者为0的时候,那么接下来的字符就都是a或者都是b。s的长度为a+b,且正好包含a个‘a’字母与b个‘b’字母;解释:“abb”,“bab”和“bba”都是正确答案。对于给定的a和b,保证存在满足要求的s。输入:a=1,b=2。原创 2025-01-19 01:36:40 · 245 阅读 · 0 评论 -
【贪心】力扣3218. 切蛋糕的最小总开销 I
这道题使用贪心算法是最高效的做法,我们观察题目,假设我们每一次沿着水平线都切到底,那么沿着该水平线切的次数就是垂直方向有多少块蛋糕,那么开销就要乘以垂直方向蛋糕的数量。那么也就是说我们应该优先沿着开销大的水平线切,否则放到后面切的话,可能该水平线切到底的开销就要乘以更多的倍数。horizontalCut 的大小为 m - 1 ,其中 horizontalCut[i] 表示沿着水平线 i 切蛋糕的开销。沿着水平线 1 切开 2 x 1 的蛋糕块,开销为 3。原创 2024-12-21 17:33:00 · 510 阅读 · 0 评论 -
【数据结构-邻项消除】力扣2211. 统计道路上的碰撞次数
我们采用贪心的思想,实际上R和L相撞,也就是两个车停下,碰撞+2,R或L和S相撞,也就是一个车停下,碰撞+1。所以也就是,除了开头为L和结尾为R的不会影响结果的车,其他L和R的车的数量一定会碰撞并且停下,那么碰撞数量就是这些L和R的车的总和。我们在代码开头,用两个while将指针跳过不影响结果的元素,然后统计L和R的数量,最终结果就是碰撞数。碰撞发生后,涉及的车辆将无法继续移动并停留在碰撞位置。因此,将会在道路上发生的碰撞总次数是 0。当一辆移动的车和一辆静止的车相撞时,碰撞次数加 1。原创 2024-10-31 02:23:10 · 556 阅读 · 0 评论 -
【状态机DP】【贪心】力扣376. 摆动序列
表示nums[i]可以接在down[i-1]的最长下降摆动子序列后面的情况,那怎么能说明down[i-1]中的最长下降摆动子序列的最后一个元素不大于nums[i-1]呢,实际上我们可以采用反证的方法,如果down[i-1]中最长下降摆动子序列的最后一个元素大于nums[i-1]的话,那么nums[i-1]则会成为down[i-1]的最后一个元素。其中一个是 [1, 17, 10, 13, 10, 16, 8] ,各元素之间的差值为 (16, -7, 3, -3, 6, -8)。,其中 n 是序列的长度。原创 2024-10-20 15:53:29 · 380 阅读 · 0 评论 -
【贪心】力扣122. 买卖股票的最佳时机 II
解释:在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4。解释:在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4。随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6 - 3 = 3。输入:prices = [7,1,5,3,6,4]返回 你能获得的 最大 利润。原创 2024-10-12 19:39:03 · 172 阅读 · 0 评论 -
【数据结构-栈】【贪心】力扣2434. 使用机器人打印字典序最小的字符串
我们可以思考,将t想象成一个栈,先进后出,然后当栈顶元素的值,也就是t的末尾的值比字符串s中的任何一个字符都要小的时候,那么我们就要将栈顶元素推入p中,也就是写出来的字符串,这样才能保证最小字典序列。,由于0代表a,1代表b…执行第一个操作四次,得到 p=“” ,s=“” ,t=“bdda”。执行第一个操作三次,得到 p=“” ,s=“” ,t=“zza”。执行第一个操作,得到 p=“ab” ,s=“” ,t=“c”。执行第二个操作,得到 p=“abc” ,s=“” ,t=“”。原创 2024-10-12 02:10:10 · 433 阅读 · 0 评论 -
【动态规划-4.2 最长递增子序列(LIS)】力扣300. 最长递增子序列
我们需要的是len的长度,len++的来源于nums[i]大于d[len],如果d[len]被替换成更小的nums[i],会对后续的len++有正面影响,如果nums[i]替换掉的不是d[len],假设是d[len-1],那么会减小d[len-1]的值,在后续的nums[i]的替换中,会变得更容易被选为pos,从而替换d[len-1],然后对后续的len++有正面影响。由于nums[i]经过二分查找,肯定比d[pos+1]要小,所以在相同长度的子序列中,末尾最小元素就为nums[i]。:O(nlogn)。原创 2024-10-08 02:10:46 · 1021 阅读 · 0 评论 -
【数据结构-差分】【贪心】力扣1526. 形成目标数组的子数组最少增加次数
我们要找的实际上有两个递增区间,一个是[3](第一个区间的最小值默认为0),他最大值3减去最小值0的差为3,第二个递增区间是[1,2],2-1=1,所以差为1。解释:(initial)[0,0,0,0] -> [1,1,1,1] -> [1,1,1,2] -> [2,1,1,2] -> [3,1,1,2] (target)。解释:(initial)[0,0,0,0,0] -> [1,1,1,1,1] -> [2,1,1,1,1] -> [3,1,1,1,1]输入:target = [1,2,3,2,1]原创 2024-09-21 17:13:24 · 585 阅读 · 0 评论 -
【贪心】【数据结构-小根堆,差分】力扣2406. 将区间分为最少组数
当新区间的左端点要比堆顶元素(最小右端点)大的时候,那么就将这个区间分到堆顶元素所在的组中,由于我们只需要记录每个组的最大右端点,那么就将堆顶元素替换成新区间的右端点,然后priority_queue将会保证堆顶元素是最小的(所有组的最大右端点比较后的最小的最大右端点)。比方说区间 [1, 5] 和 [5, 8] 相交。输入:intervals = [[5,10],[6,8],[1,5],[2,3],[1,10]]输入:intervals = [[1,3],[5,6],[8,10],[11,13]]原创 2024-09-18 02:02:22 · 491 阅读 · 0 评论 -
【贪心】【合并】力扣56. 合并区间
如果不是的话,说明会重叠,这时候就要更新merged最后一个区间的第二个元素,如果interval[1]较大,就将merged最后一个区间的第二个元素更改为interval[1]来表示一个最大的完整的范围。如上图,我们的代码会判断第二个interval的第一个元素比第一个interval的第二个元素小,这时候就会进行合并的逻辑,返回[1,4]这个错误答案。输入:intervals = [[1,3],[2,6],[8,10],[15,18]]输出:[[1,6],[8,10],[15,18]]原创 2024-09-14 15:47:17 · 446 阅读 · 0 评论 -
【贪心】力扣2960. 统计已测试设备
在设备 0 上,batteryPercentages[0] > 0 ,现在有 1 个已测试设备,batteryPercentages 变为 [1,0,1,0,2]。在设备 2 上,batteryPercentages[2] > 0 ,现在有 2 个已测试设备,batteryPercentages 变为 [1,0,1,0,1]。在设备 1 上,batteryPercentages[1] > 0 ,现在有 1 个已测试设备,batteryPercentages 变为 [0,1,1]。原创 2024-09-12 18:34:31 · 300 阅读 · 0 评论 -
【贪心算法】力扣1833.雪糕的最大数量
之后freq进行迭代,当coins >= price的时候,说明可以买得起这个价位的雪糕,然后用curCount来储存买得起雪糕的数量。商店中新到 n 支雪糕,用长度为 n 的数组 costs 表示雪糕的定价,其中 costs[i] 表示第 i 支雪糕的现金价格。,其中 n 是数组 costs 的长度。解释:Tony 可以买下所有的雪糕,总价为 1 + 6 + 3 + 1 + 2 + 5 = 18。解释:Tony 可以买下标为 0、1、2、4 的雪糕,总价为 1 + 3 + 2 + 1 = 7。原创 2024-07-16 14:23:41 · 560 阅读 · 0 评论 -
【贪心算法】力扣1338.数组大小减半
选择 {2,7} 是不可行的,它的结果数组为 [3,3,3,3,5,5,5],新数组长度大于原数组的二分之一。解释:选择 {3,7} 使得结果数组为 [5,5,5,2,2]、长度为 5(原数组长度的一半)。给你一个整数数组 arr。大小为 2 的可行集合有 {3,5},{3,2},{5,2}。输入:arr = [3,3,3,3,5,5,5,2,2,7]返回 至少 能删除数组中的一半整数的整数集合的最小大小。解释:我们只能选择集合 {7},结果数组为空。输入:arr = [7,7,7,7,7,7]原创 2024-07-19 15:03:49 · 243 阅读 · 0 评论 -
【贪心算法】力扣2279.装满石头的背包的最大数量
这道题首先题目给出了你capacity和rocks两个动态数组vector,这是比较常见的贪心题,我们首先先计算背包最大容量和背包现有的石头的差,计算出背包剩余空间。输入:capacity = [2,3,4,5], rocks = [1,2,4,4], additionalRocks = 2。输入:capacity = [10,2,2], rocks = [2,2,0], additionalRocks = 100。请你将额外的石头放入一些背包中,并返回放置后装满石头的背包的 最大 数量。原创 2024-07-17 10:01:52 · 231 阅读 · 0 评论 -
【贪心算法】力扣1481.不同整数的最少数目
for(auto [_,sb] : freq)是结构化绑定,由于我们不需要用到freq的第一个元素,所以用" _ "来表示在结构化绑定中忽略该元素。解释:先移除 4、2 ,然后再移除两个 1 中的任意 1 个或者三个 3 中的任意 1 个,最后剩下 1 和 3 两种整数。给你一个整数数组 arr 和一个整数 k。现需要从数组中恰好移除 k 个元素,请找出移除后数组中不同整数的最少数目。输入:arr = [4,3,1,1,3,3,2], k = 3。解释:移除 1 个 4 ,数组中只剩下 5 一种整数。原创 2024-07-18 11:03:01 · 307 阅读 · 0 评论