算法奇妙屋(四十二)-贪心算法学习之路 9

文章目录

一. 力扣 991. 坏了的计算器

1. 题目解析

题目还是很清晰易懂的, 只进行两种操作, 从起点数 s 变成 最终值 t, 最少需要几步操作

2. 算法原理

正面算很难, 但可以根据例子, 总结正面推导的特性, 可以用反面来直接排除一种情况

3. 代码

java 复制代码
class Solution {
    public int brokenCalc(int startValue, int target) {
        int ret = 0;
        while (target > startValue) {
            if (target % 2 == 1) {
                target++;
                ret++;
            } else {
                target /= 2;
                ret++;
            }
        }
        return ret + startValue - target;
    }
}

二. 力扣 56. 合并区间

1. 题目解析

题目简单易懂, 就是让求并集

2. 算法原理

3. 代码

java 复制代码
class Solution {
    public int[][] merge(int[][] intervals) {
        int m = intervals.length, n = 2;
        Arrays.sort(intervals, (a, b) -> a[0] - b[0]);
        List<int[]> ret = new ArrayList<>();
        for (int i = 0; i < m;) {
            int left = intervals[i][0];
            int right = intervals[i][1];
            int j = i + 1;
            for (; j < m; j++) {
                int s = intervals[j][0];
                int e = intervals[j][1];
                if (right >= s) {
                    right = Math.max(right, e);
                }else {
                    break;
                }
            }
            ret.add(new int[]{left, right});
            i = j;
        }
        return ret.toArray(new int[0][]); // 不限行, 不限列, 有多少元素全变成数组
    }
}

三. 力扣 435. 无重叠区间

1. 题目解析

需要移除区间的最少数量, 就是让求最多的不重叠子区间数量, 用求交集的方法

2. 算法原理

与上道题很相似, 不同点在于一个让求重叠区间, 这道题是不重叠区间, 并且这里right和e相等时, 不算做重叠

3. 代码

java 复制代码
class Solution {
    public int eraseOverlapIntervals(int[][] intervals) {
        Arrays.sort(intervals, (a, b) -> a[0] - b[0]);
        int m = intervals.length, ret = 0;
        for(int i = 0; i < m;) {
            int right = intervals[i][1];
            int j = i + 1;
            for (; j < m; j++) {
                int s = intervals[j][0];
                int e = intervals[j][1];
                if (right > s) {
                    right = Math.min(right, e);
                    ret++;
                }else {
                    break;
                }
            }
            i = j;
        }
        return ret;
    }
}

四. 力扣 452. 用最少数量的箭引爆气球

1. 题目解析

这里要注意, points里面x的值是出于最大值和最小值之间的, 如果直接相减会溢出

2. 算法原理

这道题画出图翻译成人话之后, 和上道题 无重叠区间 一样, 都是求交集, 只不过这里right = e时, 也算作相交

3. 代码

java 复制代码
class Solution {
    public int findMinArrowShots(int[][] points) {
        Arrays.sort(points, (a, b) -> {
            // 这里要注意, points里面x的值是出于最大值和最小值之间的, 如果直接相减会溢出
            return a[0] > b[0] ? 1 : -1; 
        });
        int m = points.length, ret = 0;
        for(int i = 0; i < m;) {
            long right = points[i][1];
            int j = i + 1;
            for (; j < m; j++) {
                long s = points[j][0];
                long e = points[j][1];
                if (right >= s) {
                    right = Math.min(right, e);
                }else {
                    break;
                }
            }
            ret++;
            i = j;
        }
        return ret;
    }
}
相关推荐
hhzz33 分钟前
Tiger AI Platform平台中增加人脸识别功能
图像处理·人工智能·算法·计算机视觉·大模型
遇乐的果园1 小时前
前端学习笔记-vue状态管理优化
前端·笔记·学习
从零开始的代码生活_1 小时前
C++ 继承详解:访问控制、对象模型、菱形继承与设计取舍
开发语言·c++·后端·学习·算法
可乐奶茶sky2 小时前
AI Agent 学习
人工智能·学习
TsingtaoAI2 小时前
3D高斯泼溅技术发展及其在具身智能领域的应用综述
人工智能·算法·ai·具身智能·高斯泼溅
atunet2 小时前
关于图算法中的连通分量检测与最小割问题7
算法
茯苓gao2 小时前
嵌入式开发笔记:EtherCAT协议从硬件到软件完整配置指南——从零搭建一套EtherCAT通信系统
笔记·嵌入式硬件·学习
心运软件2 小时前
银行客户流失预测(Python 完整实战)
算法
邪神与厨二病2 小时前
牛客周赛 Round 153
python·算法
RD_daoyi4 小时前
外链权重暴跌至13%,品牌提及反超传统链接——2026年不做Digital PR,你的独立站等于隐形
运维·网络·学习·机器学习·搜索引擎