贪心算法

2021/11/4

# 使用条件

  1. 最优子结构:每个问题都由较小的子问题组成,每个子问题都有一个最优解
  2. 局部最优解产生全局最优解
  3. 贪心算法重点步骤:搜索前先排序,排序后尽量减少无效搜索
  4. 贪心算法核心:当前最优解

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

# 860.找零

  • 我卖柠檬水,一杯五元,我最开始没钱
  • 别人来买柠檬水,给我的钱我能否交易(钱够不够?零钱能不能找?)
  • 收的钱是5,10,20
const custom = [5, 5, 5, 10];
console.log(lemonadeChange(custom)); // true
1
2

# 435.不重叠区间

  • 给二维数组,内部每个数组代表一个区间
  • 求让所有区间不重叠的最小移除数量
const intervals = [ [1,2], [2,3], [3,4], [1,3] ];

// 需要移除[1, 3]
console.log(eraseOverlapIntervals(intervals)); // 1
1
2
3
4

# 452.引爆气球最少箭

  • 我要射穿一排气球,他的坐标以二维数组给我
  • 我要射最少的箭让他们全部爆炸
const points = [[1,2],[3,4],[5,6],[7,8]];

// 没有重叠区间,要射四箭
console.log(findMinArrowShots(points)); // 4
1
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

# 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

# 45.跳跃游戏2

  • 正整数数组
  • 最少跳跃次数到最后
  • 假设一定能到最后的位置
const arr = [2, 3, 1, 1, 4];
console.log(jump(arr)); // 2
1
2

# 392.判断子序列

  • 给两个字符串
  • 一个字符串是另一个字符串的子集,且出现的顺序是正确的
const s = "abc";
const t = "ahbgdc";
console.log(isSubsequence(s, t)); // true
1
2
3

# 122.买卖股票

  • 一个数组是股票一个时间段的涨跌
  • 求能获取最大的利润
const prices = [7,1,5,3,6,4]
console.log(maxProfit(prices)); // 7
1
2
上次更新: 9/17/2024