- 贪心算法的局限性
- 具备贪心思想的问题
leetcode455 分发饼干
1.1 解题思路
1.2 代码实现🔴
1 | java复制代码class Solution { |
leetcode322 零钱兑换
2.1 解题思路
本题贪心 + 回溯不能提升性能,最优解为动态规划,后续再写。
leetcode45 跳跃游戏II
3.1 解题思路
3.2 代码实现1:DFS(会超时)
1 | java复制代码class Solution { |
3.2 代码实现2:BFS(会超时)
1 | java复制代码class Solution { |
3.3 代码实现3:贪心
1 | java复制代码class Solution { |
3.4 代码实现4:🔴贪心(只遍历一次)
1 | java复制代码class Solution { |
leetcode55 跳跃游戏
4.1 解题思路
4.2 代码实现🔴
1 | java复制代码class Solution { |
leetcode1578 避免重复字母的最小删除成本
4.1 解题思路
4.2 代码实现🔴
1 | java复制代码class Solution { |
leetcode402 移掉 K 位数字
5.1 解题思路
5.2 代码实现1:贪心,时间复杂度O(k * n)
1 | java复制代码class Solution { |
5.3 代码实现2:🔴贪心 + 单调栈 (时间复杂度O(k + n),空间复杂度O(n))
1 | java复制代码class Solution { |
6 leetcode409 最长回文串
6.1 解题思路
1. 可以将出现次数为偶数个的字符分居两侧构成回文串
2. 只能在回文串的中间添加一个出现次数为奇数个的字符
6.2 代码实现🔴
1 | java复制代码class Solution { |
leetcode680 验证回文字符串Ⅱ
7.1 解题思路
1. 贪心策略:只有在开头和结尾两个字符不相等的时候,才去尝试删除开头或者结尾任一个字符
7.2 代码实现:🔴贪心
1 | java复制代码class Solution { |
leetcode316 去除重复字母
8.1 解题思路
1. 记录字符在字符串s
中的最后索引,用于判断当前字符后面是否还有将要弹出的字符
2. 维护一个单调栈
3. 使用一个boolean数组记录是否已经存在于栈中
8.2 代码实现:🔴贪心 + 单调栈
1 | java复制代码class Solution { |
leetcode1047 删除字符串中的所有相邻重复项
9.1 解题思路
1. 使用栈
2. 使用快慢指针,0-slow
表示不需要删除的字符,fast
指针用来遍历整个字符串
9.2 代码实现1:🔴使用栈
1 | java复制代码class Solution { |
9.3 代码实现2:🔴使用快慢指针(空间复杂度降为O(1))
1 | java复制代码class Solution { |
leetcode1209 删除字符串中的所有相邻重复项II
10.1 解题思路
1. 使用栈
2. 使用快慢指针
10.2 代码实现1:🔴使用栈(时间复杂度:O(N),空间复杂度:O(N))
1 | java复制代码class Solution { |
10.3 代码实现2:🔴使用快慢指针
1 | java复制代码class Solution { |
leetcode976 三角形的最大周长
11.1 解题思路
不失一般性,我们假设三角形的边长a
,b
,c
满足a≤b≤c
,那么这三条边组成面积不为零的三角形的充分必要条件为a+b>c
。
11.2 代码实现🔴
1 | java复制代码class Solution { |
leetcode674 最长连续递增序列
12.1 解题思路
12.2 代码实现(贪心 + 双指针)🔴
1 | java复制代码class Solution { |
leetcode738 单调递增的数字
13.1 解题思路
1. 先遍历找到第一个非递增的序列
2. 回退check直至其为递增序列
3. 将最后改变高位之后的数字全部换成9
13.2 代码实现🔴
1 | java复制代码class Solution { |
leetcode134 加油站
14.1 解题思路
总结:如果x到不了y + 1(但能到y),那么从x到y的任一点出发都不可能到达y+1。因为从其中任一点出发的话,相当于从0开始加油,而如果从x出发到该点则不一定是从0开始加油,可能还有剩余的油。既然不从0开始都到不了y+1,那么从0开始就更不可能到达y+1了。
14.2 代码实现🔴
1 | java复制代码class Solution { |
leetcode767 重构字符串
15.1 解题思路
15.2 代码实现🔴
1 | java复制代码class Solution { |
leetcode621 任务调度器
16.1 解题思路
1. 完成所有任务所需要的最短时间 = 待命的任务数 + 所有的任务数
2. 次数最多的任务数只出现了一个的情况
3. 次数最多的任务数出现了多个的情况
4. 出现次数最多的任务数大于冷却时间
16.2 代码实现🔴
1 | java复制代码class Solution { |
leetcode670 最大交换
17.1 解题思路
贪心策略:拿高位后面比高位大的值进行交换,而且越大越好
17.2 代码实现1:暴力
1 | java复制代码class Solution { |
17.3 代码实现2:🔴贪心
1 | java复制代码class Solution { |
leetcode861 翻转矩阵后的得分
18.1 解题思路
18.2 代码实现🔴
1 | java复制代码class Solution { |
leetcode1029 两地调度
19.1 解题思路
最优方案:选出price_A - price_B
最小的N个人,让他们飞往A市,其余的飞往B市
19.2 代码实现:🔴贪心
1 | java复制代码class Solution { |
leetcode330 按要求补齐数组
20.1 解题思路
1. 贪心思想:每次加入nums
的数都要在满足条件的前提下尽可能的大以覆盖更大的范围。
2. 对于正整数x
,如果区间[1, x - 1]内的所有数字都已经被覆盖,且x
在数组中,则区间[1, 2x - 1]内的数字也都被覆盖。
20.2 代码实现🔴
1 | java复制代码class Solution { |
本文转载自: 掘金