1. 贪心算法核心思想与应用场景
贪心算法(Greedy Algorithm)是一种在每一步选择中都采取当前状态下最优决策的算法策略。这种局部最优解的累积最终希望能够达到全局最优解。与动态规划不同,贪心算法不会回溯之前的决策,这使得它在时间复杂度上通常具有优势。
贪心算法有效的两个关键条件:
- 贪心选择性质:局部最优解能导致全局最优解
- 最优子结构:问题的最优解包含其子问题的最优解
在实际编码面试中,贪心算法常用于解决以下几类问题:
- 区间调度问题(如本文的三个题目)
- 分配问题(如分糖果、任务分配)
- 图论中的最小生成树、最短路径问题
- 数据压缩(如哈夫曼编码)
提示:贪心算法虽然思路简单,但证明其正确性往往需要一定的数学基础。在实际面试中,如果无法严格证明,至少要通过多个测试用例验证。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 用最少数量的箭引爆气球(452题)
2.1 问题分析与解法思路
题目描述:在二维空间中有许多气球,输入是每个气球的直径起点和终点坐标。我们有一支弓箭,可以垂直x轴射出。如果箭的x坐标在气球的直径范围内,气球就会被引爆。求最少需要多少支箭才能引爆所有气球。
关键观察点:
- 气球在x轴上的投影是一个区间
- 箭只要射在区间重叠部分就能同时引爆多个气球
- 问题转化为:找出最少的点,使每个区间至少包含一个点
解法步骤:
- 将所有区间按照起点进行排序
- 初始化箭数为1(至少需要一支箭)
- 遍历排序后的区间,维护当前箭能覆盖的最右边界
- 如果新区间的起点超过当前最右边界,需要增加一支箭
- 否则更新最右边界为当前区间和最右边界中的较小值
2.2 代码实现与细节解析
java复制class Solution {
public int findMinArrowShots(int[][] points) {
// 按照起点升序排序
Arrays.sort(points, (a, b) -> Integer.compare(a[0], b[0]));
int ans = 1; // 至少需要一支箭
for (int i = 1; i < points.length; i++) {
if (poin
