LeetCode每日1题--435. 无重叠区间

88 阅读2分钟

theme: fancy

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第34天,点击查看活动详情

前言

算法的重要性不言而喻!区分度高!

现在学习的门槛低了,只有能上网每个人都可以学编程!培训班6个月就可以培养出来能干活的人,你怎么从这些人中脱颖而出?没错!就是学算法,学一些底层和基础的东西。

说的功利点是为了竞争,卷死对手。真心话说就是能提高自己的基础能力,为技术可持续发展做好充分的准备!!!

提前入门学习书籍:CPrimerPlus、大话数据结构

image-20220705103735001

刷题网站

代码随想录 (programmercarl.com)

leetcode

我是按照代码随想录提供的刷题顺序进行刷题的,大家也可以去刷leetcode最热200道,都可以

刷题嘛,最重要的就是坚持了!!!

画图软件

OneNote

这个要经常用,遇见不懂的流程的话就拿它画一画!

笔记软件

Typoral

题目

leetcode.cn/problems/no…

image.png

解析

依旧先排序,对于二维数组的排序我们采用如下:

Arrays.sort(intervals, (a, b) -> {
    
    return a[1] - b[1];
});

我们按照区间右边界升序排序,上面是固定写法。如果是降序就是b[1] - a[1]

接下来就去遍历二位数组,如果

  • 上一个区间的右边界小于当前区间的左边界,说明无交集
  • 否则就要减去一个区间,但是我们不用真把它从数组中去掉,我们用count模拟次数即可

最后把count返回即可~

我们依旧是看下图,把所有的一维数组中的右边界提取出来,然后代入判断

是不是和上一题很像呢?其实差不多的,比较完都要对边界进行更新,通过这种方式即可计算出需要几次剔除才能得到无重叠的区间!

image.png

完整代码

看不懂?没办法,多写多练多总结!

还是带入代码到示例中多去总结多练习!

class Solution {
    public int eraseOverlapIntervals(int[][] intervals) {
        Arrays.sort(intervals, (a, b) -> {
            // 按照区间右边界升序排序
            return a[1] - b[1];
        });

        int count = 0;
        int edge = Integer.MIN_VALUE;
        for (int i = 0; i < intervals.length; i++) {
            // 若上一个区间的右边界小于当前区间的左边界,说明无交集
            if (edge <= intervals[i][0]) {
                edge = intervals[i][1];
            } else {
                count++;
            }
        }

        return count;
    }
}