# 使用条件
- 最优子结构:每个问题都由较小的子问题组成,每个子问题都有一个最优解
- 局部最优解产生全局最优解
- 贪心算法重点步骤:搜索前先排序,排序后尽量减少无效搜索
- 贪心算法核心:当前最优解
js的sort的排序时间:O(mlogm)
# 455.发饼干
- 每个孩子 i,想吃饼干大小 g[i]
- 并且每块饼干 j,都有一个尺寸 s[j]
- 如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。求最大满足数。
const g = [1,2];
const s = [1,2,3];
console.log(findContentChildren(g, s)); // 2
1
2
3
4
2
3
4
# 860.找零
- 我卖柠檬水,一杯五元,我最开始没钱
- 别人来买柠檬水,给我的钱我能否交易(钱够不够?零钱能不能找?)
- 收的钱是5,10,20
const custom = [5, 5, 5, 10];
console.log(lemonadeChange(custom)); // true
1
2
2
# 435.不重叠区间
- 给二维数组,内部每个数组代表一个区间
- 求让所有区间不重叠的最小移除数量
const intervals = [ [1,2], [2,3], [3,4], [1,3] ];
// 需要移除[1, 3]
console.log(eraseOverlapIntervals(intervals)); // 1
1
2
3
4
2
3
4
# 452.引爆气球最少箭
- 我要射穿一排气球,他的坐标以二维数组给我
- 我要射最少的箭让他们全部爆炸
const points = [[1,2],[3,4],[5,6],[7,8]];
// 没有重叠区间,要射四箭
console.log(findMinArrowShots(points)); // 4
1
2
3
4
2
3
4
# 56.合并区间
- 给定一个二维数组区间,把所有重叠的区间进行合并
const intervals = [[1,3],[2,6],[8,10],[15,18]];
console.log(merge(intervals)); //[[1,6],[8,10],[15,18]]
1
2
2
# 55.跳跃问题
- 一个正整数数组
- 每个数字代表能跳跃的步数
- 判断能否跳到最后一个位置
const arr1 = [2, 3, 1, 1, 4];
console.log(canJump(arr1)); // true
const arr2 = [3, 2, 1, 0, 4];
console.log(canJump(arr2)); // false
1
2
3
4
5
2
3
4
5
# 45.跳跃游戏2
- 正整数数组
- 最少跳跃次数到最后
- 假设一定能到最后的位置
const arr = [2, 3, 1, 1, 4];
console.log(jump(arr)); // 2
1
2
2
# 392.判断子序列
- 给两个字符串
- 一个字符串是另一个字符串的子集,且出现的顺序是正确的
const s = "abc";
const t = "ahbgdc";
console.log(isSubsequence(s, t)); // true
1
2
3
2
3
# 122.买卖股票
- 一个数组是股票一个时间段的涨跌
- 求能获取最大的利润
const prices = [7,1,5,3,6,4]
console.log(maxProfit(prices)); // 7
1
2
2