IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> leetcode记录-435-贪心 -> 正文阅读

[数据结构与算法]leetcode记录-435-贪心

无重叠区间

思路

  1. 自己的:自己的思路是,遍历每个元素,对于i对应的元素,如果比j对应的首元素小,当i尾>j首且i尾<j尾,去掉区间j(标志数组对应为1);当i尾>=j尾,去掉区间i。每个区间与其他所有的比较。—— 思路上可行,但是要注意,应该要按照首元素排序,否则可能因为第一个元素起点过大导致结果不同。
  2. 题解的:
    ①元素按照首元素排序,然后从第一个元素开始,让end标志为其尾巴,如果后面的元素头>=end,证明没有相交,且因为按头排序的,所以一个一个比较遇到的正好是第一个满足这种情况的元素,他为下一个不相交区间,end为他的尾巴;如果后面的元素头<end,证明相交了,此时end为两者尾巴小的那个尾巴(同样情况下尽量尾巴要小),去掉区间数加一。
    ②元素按照尾元素排序,每次尽可能选择尾巴小的。让end为第一个的尾巴,后面的元素,如果头>end,end就为他的尾;如果不是,end不变,因为相交的尾巴肯定比end大,秉承偏好尾巴小,我们直接去掉区间数+1即可。

代码

  1. 自己的(虽然没通过全部用例)
class Solution {
    public int eraseOverlapIntervals(int[][] intervals) {
       Arrays.sort(intervals,((o1, o2) -> (o1[0]-o2[0])));
        int[] a = new int[intervals.length];
        int flag = 0;
        for (int i = 0; i < intervals.length; i++) {
            for (int j = 0; j<intervals.length; j++) {
                if (j != i &&intervals[i][0]<=intervals[j][0] && a[j]==0 && a[i]==0){
                    if (intervals[i][1]>intervals[j][0] && intervals[i][1]<intervals[j][1]){
                        a[j]=1;
                        flag++;
                        System.out.println(Arrays.toString(intervals[j]));
                    }else if (intervals[i][1]>intervals[j][0] && intervals[i][1]>=intervals[j][1]){
                        a[i]=1;
                        flag++;
                        System.out.println(Arrays.toString(intervals[i]));
                        break;
                    }
                }
            }
        }
        return flag;
    }
}

在这里插入图片描述
这个用例一眼望不到边,但是能到55证明方法可行,只是太笨了。
2. 排序首元素

class Solution {
    public int eraseOverlapIntervals(int[][] intervals) {
       Arrays.sort(intervals,(o1, o2) -> (o1[0]-o2[0]));
        int end = intervals[0][1];
        int flag = 0;
        for (int i = 1; i < intervals.length; i++) {
            if(end<=intervals[i][0])
                end=intervals[i][1];
            else {
                end=Math.min(end,intervals[i][1]);
                flag++;
            }
        }
        return flag;
    }
}
  1. 排序尾元素
class Solution {
    public int eraseOverlapIntervals(int[][] intervals) {
       Arrays.sort(intervals,(o1, o2) -> (o1[1]-o2[1]));
        int flag=0;
        int end=intervals[0][1];
        for (int i = 1; i < intervals.length; i++) {
            if (end<=intervals[i][0])
                end=intervals[i][1];
            else
                flag++;
        }
        return flag;
    }
}

技巧

  1. 数组排序:
    ①升序排一维:Arrays.sort(ints);
    ②升序排一维部分:Arrays.sort(ints, 2, 5);
    ③升序排二维某个下标:Arrays.sort(ints,(o1, o2) -> (o1[1]-o2[1])); 其中[1]指的是下标,按照自己想要的替换。
  2. 时间范围、区间调度等可参考,且题目需要两个方向考虑时思考能否一个方向贪心(从左到右满足某个条件+从右往左满足另一个,某边满足某个条件即可等)。
  3. flag设为初始值,在循环中根据条件flag变更值。
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-01-30 19:10:58  更:2022-01-30 19:11:45 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 18:36:38-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码