算法奇妙屋(四十二)-贪心算法学习之路 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;
    }
}
相关推荐
lhh_qrsly2 小时前
HTTP / HTTPS / MQTT / MQTTs(嵌入式学习版)
学习·http·https
zyl76515 小时前
FlashAttention 详解:从 GPU 硬件、普通 Attention 到分块计算与 Online Softmax
算法
爱读书的小胖19 小时前
LeetCode 122:买卖股票的最佳时机 II(C)解题分析
算法
结局无敌19 小时前
React Native for OpenHarmony 实战:三方库 react-native-modal-dialog 的鸿蒙化适配指南
深度学习·算法·react native·react.js·harmonyos
OPEN-F19 小时前
ROS2系列教程:上位机建图与导航(原理综合)
算法·机器人
weixin_3077791319 小时前
C++代码实现MATLAB中的fitrtree函数功能
开发语言·c++·算法·matlab
xier_ran19 小时前
【infra之路】AI 编译器学习笔记(十三):AI 编译器全景——TVM、XLA、IREE 与其他
人工智能·笔记·学习
连山齐名19 小时前
ai应用开发的学习笔记
服务器·笔记·学习
tomwang032220 小时前
路径优化建模、优化算法分类及工程化小结
算法·数学建模·分类
小羊没烦恼!20 小时前
Ajax与JSON的一些总结
android·java·前端·数据库·mysql·算法·okhttp