带你读《图解算法小抄》二十二、贪心算法(6)

简介: 带你读《图解算法小抄》二十二、贪心算法(6)

带你读《图解算法小抄》二十二、贪心算法(5)https://developer.aliyun.com/article/1347849?groupCode=tech_library


7.无重叠区间

1)题目描述

给定一个由多个区间组成的数组 intervals,找到需要移除的区间数量,使得剩余的区间没有重叠。要求返回移除的最少区间数量。

2)解题步骤

为了解决无重叠区间的问题,我们可以使用贪心算法来解决。贪心算法的思路是优先选择结束位置较小的区间,这样可以给后面的区间留下更多的空间。

 

我们按照以下步骤进行解题:

 

  • 将区间数组 intervals 按照结束位置的大小进行升序排序。
  • 初始化变量 end 为第一个区间的结束位置。
  • 初始化变量 count 为 0,表示需要移除的区间数量。
  • 从第二个区间开始遍历,对于每个区间 (start, end):
  • 如果当前区间的开始位置大于等于 end,表示当前区间与前一个区间没有重叠,更新 end 为当前区间的结束位置。
  • 否则,当前区间与前一个区间重叠,需要移除该区间,将 count 增加 1。

 

  • 返回 count,即需要移除的最少区间数量。

以下是使用贪心算法解决无重叠区间问题的算法框架:

 

function eraseOverlapIntervals(intervals) {
  intervals.sort((a, b) => a[1] - b[1]);  let end = intervals[0][1];
  let count = 0;  for (let i = 1; i < intervals.length; i++) {
    const [start, currEnd] = intervals[i];    if (start >= end) {
      end = currEnd;
    } else {
      count++;
    }
  }
  return count;
}

8.爆破气球的最少箭数

1)题目描述

给定一组气球的坐标 points,每个气球由一个二维数组表示,其中 points[i] = [x, y] 表示气球的水平坐标和垂直坐标。现在有一支箭,可以垂直射出。如果箭能够击中某个气球,那么该气球以及与其相邻的气球都会被引爆。求解击爆所有气球所需的最小箭数。

2)解题步骤

为了解决最小箭数的问题,我们可以使用贪心算法来解决。贪心算法的思路是优先选择能够引爆尽可能多的气球的箭。

 

我们按照以下步骤进行解题:

 

  • 将气球按照水平坐标的结束位置进行排序,即按照 points[i][1] 进行升序排序。这样做的目的是将相邻的气球放在一起,方便进行处理。
  • 初始化变量 end 为第一个气球的结束位置,初始化变量 arrows 为 1,表示需要至少一支箭。
  • 遍历排序后的气球列表,对于每个气球:
  • 如果当前气球的开始位置大于 end,则说明当前气球与之前的气球没有重叠,需要增加一支箭,更新 end 为当前气球的结束位置。
  • 否则,当前气球与之前的气球重叠,无需增加箭数,更新 end 为当前气球的结束位置。

 

  • 遍历结束后,arrows 就是所需的最小箭数。

以下是使用贪心算法解决最小箭数问题的算法框架:

 

function findMinArrowShots(points) {
  if (points.length === 0) {
    return 0;
  }  points.sort((a, b) => a[1] - b[1]);  let end = points[0][1];
  let arrows = 1;  for (let i = 1; i < points.length; i++) {
    if (points[i][0] > end) {
      arrows++;
      end = points[i][1];
    }
  }
  return arrows;
}


带你读《图解算法小抄》二十二、贪心算法(7)https://developer.aliyun.com/article/1347846?groupCode=tech_library

相关文章
|
3月前
|
算法 C++ Python
数据结构与算法===贪心算法
数据结构与算法===贪心算法
|
1天前
|
算法 前端开发
一文了解贪心算法和回溯算法在前端中的应用
该文章深入讲解了贪心算法与回溯算法的原理及其在前端开发中的具体应用,并通过分析LeetCode题目来展示这两种算法的解题思路与实现方法。
|
1月前
|
算法
【算法】贪心算法——柠檬水找零
【算法】贪心算法——柠檬水找零
|
1月前
|
算法
【算法】贪心算法简介
【算法】贪心算法简介
|
2月前
|
算法 Python
Python算法高手进阶指南:分治法、贪心算法、动态规划,掌握它们,算法难题迎刃而解!
【7月更文挑战第10天】探索Python算法的精华:分治法(如归并排序)、贪心策略(如找零钱问题)和动态规划(解复杂问题)。通过示例代码揭示它们如何优化问题解决,提升编程技能。掌握这些策略,攀登技术巅峰。
69 2
|
2月前
|
存储 算法 Python
Python算法界的秘密武器:分治法巧解难题,贪心算法快速决策,动态规划优化未来!
【7月更文挑战第9天】Python中的分治、贪心和动态规划是三大关键算法。分治法将大问题分解为小问题求解,如归并排序;贪心算法每步选局部最优解,不保证全局最优,如找零钱;动态规划存储子问题解求全局最优,如斐波那契数列。选择合适算法能提升编程效率。
50 1
|
2月前
|
存储 算法 大数据
Python算法高手的必修课:深入理解分治法、贪心算法、动态规划,让你的代码更智能!
【7月更文挑战第9天】在Python算法学习中,分治法(如归并排序)将大问题分解为小部分递归解决;贪心算法(如货币找零)在每步选择局部最优解尝试达到全局最优;动态规划(如斐波那契数列)通过存储子问题解避免重复计算,解决重叠子问题。掌握这三种方法能提升代码效率,解决复杂问题。
36 1
|
2月前
|
算法 索引 Python
逆袭算法界!Python分治法、贪心算法、动态规划深度剖析,带你走出算法迷宫!
【7月更文挑战第8天】分治法,如快速排序,将大问题分解并合并解;贪心算法,选择局部最优解,如活动选择;动态规划,利用最优子结构避免重复计算,如斐波那契数列。Python示例展示这些算法如何解决实际问题,助你精通算法,勇闯迷宫。
34 1
|
2月前
|
算法 索引 Python
Python算法设计与分析大揭秘:分治法、贪心算法、动态规划...掌握它们,让你的编程之路更加顺畅!
【7月更文挑战第8天】探索Python中的三大算法:分治(如快速排序)、贪心(活动选择)和动态规划(0-1背包问题)。分治法将问题分解求解再合并;贪心策略逐步求局部最优;动态规划通过记忆子问题解避免重复计算。掌握这些算法,提升编程效率与解决问题能力。
33 1
|
2月前
|
算法 开发者 Python
惊!Python算法界的三大神器:分治法、贪心算法、动态规划,让你秒变算法大师!
【7月更文挑战第8天】在Python编程中,分治、贪心和动态规划是核心算法。分治如归并排序,将大问题拆解并递归求解;贪心算法针对找零问题,每次都选最大面额硬币,追求局部最优;动态规划则通过记忆化避免重复计算,如斐波那契数列。这些算法巧妙地提升效率,解决复杂问题。
29 0