贪心算法题型总结

🍋什么是贪心算法?

贪心算法:是一种思想,解答要根据具体题目来编写代码,它让每一步都是局部最优的方案。

🍋1. 分配饼干

题目描述链接

https://leetcode.cn/problems/assign-cookies/

题目特点

寻找最优解,一维数组。

代码实现

贪心大致思路:先边界判断,直接排序,后找到需要的情况返回。

public int findContentChildren(int[] g, int[] s) {
   
    if (g==null || s==null){
   
        return 0;
    }
    Arrays.sort(g);
    Arrays.sort(s);
    int i=0,j=0;
    while(i<g.length&&j<s.length){
   
        if (g[i]<=s[j]){
   
            j++;
        }
        i++;
    }
    return j;
}
时间复杂度和空间复杂度

时间复杂度:O(NlogN);

空间复杂度:O(N)。

🍋2. 不重叠的区间个数

题目描述链接

https://leetcode.cn/problems/non-overlapping-intervals/

题目特点

寻找最优解,一维数组。

代码实现

贪心大致思路:先边界判断,直接排序,后找到需要的情况返回。

public int eraseOverlapIntervals(int[][] intervals) {
   
    //边界判断
    if (intervals==null){
   
        return 0;
    }
    //排序
    Arrays.sort(intervals, new Comparator<int[]>() {
   
        @Override
        public int compare(int[] o1, int[] o2) {
   
            return (o1[1]<o2[1])?-1:(o1[1]==o2[1]?0:1);
        }
    });
    //找到符合条件的情况
    int ans=0;
    int right=intervals[0][1];
    for (int i = 0; i < intervals.length; i++) {
   
        if (intervals[i][0]>=right){
   
            ans++;
            right=intervals[i][1];
        }
    }
    return intervals.length-ans;
}
时间复杂度和空间复杂度

时间复杂度:O(NlogN);

空间复杂度:O(N)。

🍋3. 投飞镖刺破气球

题目描述链接

https://leetcode.cn/problems/minimum-number-of-arrows-to-burst-balloons/

题目特点

寻找最优解,一维数组。

代码实现

贪心大致思路:先边界判断,直接排序,后找到需要的情况返回。

public int findMinArrowShots(int[][] points) {
   
    //先判断边界条件
    if (points==null){
   
        return 0;
    }
    //排序
    Arrays.sort(points, new Comparator<int[]>() {
   
        
### 贪心算法经典应用场景 贪心算法因其高效性和简洁性,在许多实际问题中得到了广泛应用。以下是几个经典的应用场景及其对应的例题解析: #### 1. **资源分配** - 在资源有限的情况下,如何最大化某种收益或者最小化某种成本是一个常见的问题。例如,给定一组孩子的胃口需求和一组饼干尺寸,目标是尽可能多地满足孩子们的需求。 ```python def findContentChildren(g, s): g.sort() s.sort() child = cookie = 0 while child < len(g) and cookie < len(s): if s[cookie] >= g[child]: child += 1 cookie += 1 return child ``` 这里展示了如何利用贪心策略解决资源分配问题[^5]。 #### 2. **区间覆盖** - 给定一系列区间,选择最少数量的区间使得它们能够完全覆盖某个范围。这类问题是典型的贪心算法应用之一。 解决方法通常是按照区间的结束位置进行排序,并每次选取最早结束的区间来扩展已覆盖区域[^4]。 #### 3. **活动安排** - 如果有多个活动需要在同一时间段内完成,而每个活动都有自己的起始时间和结束时间,那么可以通过贪心算法找到最大不重叠活动集合。 方法是对所有活动按结束时间升序排列,依次挑选最早的结束时间并跳过与其冲突的所有其他活动[^2]。 #### 4. **哈夫曼编码** - 数据压缩领域的一个重要技术就是基于频率构建二叉树来进行有效编码的过程称为哈夫曼编码。此过程依赖于不断合并权重最低节点直到形成单棵树为止这一原则实现最优前缀码生成[^1]。 #### 5. **最短路径问题** - Dijkstra算法本质上也是一种形式上的贪婪搜索方式用于寻找图上两点间距离最近的一条路经。尽管严格意义上Dijkstra属于动态规划范畴但由于其迭代过程中总是优先处理离起点较近顶点所以也体现了某些程度上的“贪恋”特性。 ### §相关问题§ 1. 如何证明特定情况下采用贪心法确实可以获得全局最佳解答? 2. 当遇到无法单纯依靠一次遍历决定整体方案的问题时,我们应怎样调整思路去尝试引入更多约束条件使之适配贪心框架下求解呢? 3. 对比分析回溯法与分支限界法同贪心算法之间主要区别有哪些方面体现出来? 4. 是否存在一些特殊类型的背包问题可以用纯正意义上的贪心法则予以完美处置而不必诉诸整数线性规划模型之类的高级手段吗? 5. 关于旅行商(TSP)难题是否存在任何版本允许借助简化假设前提下的准确定义从而让标准版贪心流程得以生效发挥作用的机会窗口么 ?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值