算法奇妙屋(四十二)-贪心算法学习之路 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;
    }
}
相关推荐
CoderCodingNo2 小时前
【NOIP】1998真题解析 luogu-P1010 幂次方 | GESP四、五级以上可练习
算法
EmbeddedCore2 小时前
MQTT协议学习笔记(深入解析版)
笔记·学习
py有趣2 小时前
力扣热门100题之最小覆盖子串
算法·leetcode
汀、人工智能2 小时前
[特殊字符] 第102课:添加与搜索单词
数据结构·算法·均值算法·前缀树·trie·添加与搜索单词
汀、人工智能2 小时前
07 - 字典dict:哈希表的Python实现
数据结构·算法·数据库架构·哈希表的python实现
oG99bh7CK2 小时前
高光谱成像基础(六)滤波匹配 MF
人工智能·算法·目标跟踪
汀、人工智能2 小时前
04 - 控制流:if/for/while
数据结构·算法·链表·数据库架构··if/for/while
努力学习的小廉2 小时前
我爱学算法之——动态规划(四)
算法·动态规划
北顾笙9803 小时前
day15-数据结构力扣
数据结构·算法·leetcode