算法刷题记三(贪心)

迈不过友情╰ 2022-09-02 08:12 227阅读 0赞

文章目录

    • 分发饼干(8/2-455)
    • 无重叠区间(8/3-435)

分发饼干(8/2-455)

在这里插入图片描述
在这里插入图片描述


解析:

  • 给一个孩子的饼干应当尽量小并且又能满足该孩子,这样大饼干才能拿来给满足度比较大的孩子。
  • 因为满足度最小的孩子最容易得到满足,所以先满足满足度最小的孩子。

在以上的解法中,我们只在每次分配时饼干时选择一种看起来是当前最优的分配方法,但无法保证这种局部最优的分配方法最后能得到全局最优解。我们假设能得到全局最优解,并使用反证法进行证明,即假设存在一种比我们使用的贪心策略更优的最优策略。如果不存在这种最优策略,表示贪心策略就是最优策略,得到的解也就是全局最优解。

证明:假设在某次选择中,贪心策略选择给当前满足度最小的孩子分配第 m 个饼干,第 m 个饼干为可以满足该孩子的最小饼干。假设存在一种最优策略,可以给该孩子分配第 n 个饼干,并且 m < n。我们可以发现,经过这一轮分配,贪心策略分配后剩下的饼干一定有一个比最优策略来得大。因此在后续的分配中,贪心策略一定能满足更多的孩子。也就是说不存在比贪心策略更优的策略,即贪心策略就是最优策略。

在这里插入图片描述


Java实现:

  1. class Solution {
  2. public int findContentChildren(int[] g, int[] s) {
  3. if (g == null || s == null) return 0;
  4. Arrays.sort(g);
  5. Arrays.sort(s);
  6. int gi = 0, si = 0;
  7. while (gi < g.length && si < s.length) {
  8. if (g[gi] <= s[si]) {
  9. gi++;
  10. }
  11. si++;
  12. }
  13. return gi;
  14. }
  15. }

在这里插入图片描述

无重叠区间(8/3-435)

在这里插入图片描述
在这里插入图片描述


解析:

在这里插入图片描述


Java实现:

  1. class Solution {
  2. public int eraseOverlapIntervals(int[][] intervals) {
  3. if (intervals.length == 0) {
  4. return 0;
  5. }
  6. //排序
  7. Arrays.sort(intervals, new Comparator<int[]>() {
  8. public int compare(int[] interval1, int[] interval2) {
  9. return interval1[1] - interval2[1];
  10. }
  11. });
  12. int n = intervals.length; //区间的个数
  13. int end = intervals[0][1]; //首区间的结尾值
  14. int ans = 1; //统计
  15. for (int i = 1; i < n; ++i) {
  16. if (intervals[i][0] >= end) { //如果当前区间的 首值 大于 首区间的 结尾值,就赋值替换
  17. ++ans;
  18. end = intervals[i][1];
  19. }
  20. }
  21. return n - ans;
  22. }
  23. }

在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,227人围观)

还没有评论,来说两句吧...

相关阅读

    相关 贪心算法

    1.递增数组 题目链接:[递增数组][Link 1] 题目介绍: > 牛牛有一个数组array,牛牛可以每次选择一个连续的区间,让区间的数都加1,他想知道把这

    相关 算法-

    剑指Offer快速过了一遍 字节-飞书高频题-前15 各公司的高频面试算法题,可在 [CodeTop][]查询 (1) 146. LRU 缓存机制 我的实现