代码编织梦想

✅作者简介:我是18shou,一名即将秋招的java实习生

✨个人主页:_18shou

🔥系列专栏:牛客刷题专栏

👉 在线刷题面经模拟面试

  

题目

题目主要信息:

  • 给出一组区间,区间包括起始点,要求将重叠的区间合并
  • 重叠后的区间按照起点位置升序排列

思路

方法: 排序+贪心(推荐使用)

知识点:贪心思想

贪心思想属于动态规划思想中的一种,其基本原理是找出整体当中给的每个局部子结构的最优解,并且最终将所有的这些局部最优解结合起来形成整体上的一个最优解。

什么样的区间能够合并,那肯定是有交叉的区间,即后一个区间的尾小于前一个区间的首,这时候可以将这种交叉区间的尾合并延长区间:

//区间有重叠,更新结尾
if(intervals[i].start <= res.back().end) 
    res.back().end = max(res.back().end, intervals[i].end);

那我们肯定是区间在一定程度上有序的才可以方便比较(区间有两个边界值,完全有序不可能,但是可以按照区间首排序),这时候只要遍历到交叉的情况,就利用贪心思想,一直合并,直到不能合并为止。

具体做法:

  • step 1:既然要求重叠后的区间按照起点位置升序排列,我们就将所有区间按照起点位置先进行排序。使用sort函数进行排序,重载比较方式为比较interval结构的start变量。
  • step 2:排序后的第一个区间一定是起点值最小的区间,我们将其计入返回数组res,然后遍历后续区间。
  • step 3:后续遍历过程中,如果遇到起点值小于res中最后一个区间的末尾值的情况,那一定是重叠,取二者最大末尾值更新res中最后一个区间即可。
  • step 4:如果遇到起点值大于res中最后一个区间的末尾值的情况,那一定没有重叠,后续也不会有这个末尾的重叠区间了,因为后面的起点只会更大,因此可以将它加入res。

题解

import java.util.*;
public class Solution {
    public ArrayList<Interval> merge(ArrayList<Interval> intervals) {
        ArrayList<Interval> res = new ArrayList<>();
        //去除特殊情况
        if(intervals.size() == 0) 
            return res;
        //重载比较,按照区间首排序
        Collections.sort(intervals, new Comparator<Interval>(){
            public int compare(Interval o1, Interval o2){
                if(o1.start != o2.start)
                    return o1.start - o2.start;
                else
                    return o1.end - o2.end;
            }
        }); 
        //放入第一个区间
        res.add(intervals.get(0)); 
        int count = 0;
        //遍历后续区间,查看是否与末尾有重叠
        for(int i = 1; i < intervals.size(); i++){
            Interval o1 = intervals.get(i);
            Interval origin = res.get(count);
            if(o1.start > origin.end){
                res.add(o1);
                count++;
            //区间有重叠,更新结尾
            }else{ 
                res.remove(count);
                Interval s = new Interval(origin.start, o1.end);
                if(o1.end < origin.end)
                    s.end = origin.end;
                res.add(s);
            }
        }
        return res;
    }
}

📃结语

兄弟们,一起来刷题👉写题

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_60264772/article/details/127120217

牛客刷题-Java专项练习(2022-3-30)-爱代码爱编程

📢 本文章按照牛客网每日一练上的10道题目上做错的习题来记录错题,并分享解析。 👤 公众号:恩故事还在继续 打卡时间 📅 2022-3-29 题目类型:基础概念 题目难易程度: ⭐️⭐️⭐️ 题目数量:10    答对题目数:8   准确率:80% 1️⃣ 表达式(short)10/10.2*2运算后结果类型是(C) A.

每日牛客刷题之链表__18shou的博客-爱代码爱编程

✅作者简介:我是18shou,一名即将秋招的java实习生 ✨个人主页:_18shou 🔥系列专栏:牛客刷题专栏 📃推荐一款模拟面试、刷题神器👉 在线刷题面经模拟面试 目录 看题1之反转链表 思路1 代码1 复杂度1 思路2 代码2 复杂度2 题目2之链表从尾到头返回 思路2.1 代码2.1 复杂度2.1 思路2.2

牛客每日刷题之数组__18shou的博客-爱代码爱编程

✅作者简介:我是18shou,一名即将秋招的java实习生 ✨个人主页:_18shou 🔥系列专栏:牛客刷题专栏 📃推荐一款模拟面试、刷题神器👉 在线刷题面经模拟面试 目录 看题1之二维数组中的查找 思路1 代码1 复杂度1 题目2之数组中重复的数字 思路2.1 代码2.1 复杂度2.1 思路2.2 代码2.2 复杂度

牛客每日刷题之链表__18shou的博客-爱代码爱编程

✅作者简介:我是18shou,一名即将秋招的java实习生 ✨个人主页:_18shou 🔥系列专栏:牛客刷题专栏 📃推荐一款模拟面试、刷题神器👉 在线刷题面经模拟面试 目录 题目 思路 题解 复杂度 题目   描述 将一个节点数为size链表m位置到n位置之间的区间反转,要求时间复杂度O(n),空间复杂度O(1)。例如: 给

牛客每日刷题之二叉树__18shou的博客-爱代码爱编程

目录 题目 思路1 思路2 题解1  题解2 复杂度 📃结语 ✅作者简介:我是18shou,一名即将秋招的java实习生 ✨个人主页:_18shou 🔥系列专栏:牛客刷题专栏 📃推荐一款模拟面试、刷题神器👉 在线刷题面经模拟面试 题目 描述 给定一个二叉树根节点,请你判断这棵树是不是二叉 搜索树。 二叉搜索树满足每个节点

牛客每日刷题之动态规划__18shou的博客-爱代码爱编程

✅作者简介:我是18shou,一名即将秋招的java实习生 ✨个人主页:_18shou 🔥系列专栏:牛客刷题专栏 👉 在线刷题面经模拟面试 目录 描述 思路 题解 复杂度 📃结语 描述   思路 用dp记录收益之和,对于价格贪心只要当天价格比前一天高那么做一次交易,dp加上收益一直到结束,输出, 时间复杂度O(n)空

【pta】英文单词排序_酒徒ᝰ.的博客-爱代码爱编程

个人名片: 博主:酒徒ᝰ. 个人简介:沉醉在酒中,借着一股酒劲,去拼搏一个未来。 专栏:PTA习题及解析 介绍:记录了博主在pta学习练题 目录 前言1.简介2.优点 一、题目二、代码三、笔记

基于ssm框架的图片分享及评价网站设计与实现 毕业设计-附源码201524_dzbs2000的博客-爱代码爱编程

ssm图片分享及评价网站 摘 要 大数据时代下,数据呈爆炸式地增长。为了迎合信息化时代的潮流和信息化安全的要求,利用互联网服务于其他行业,促进生产,已经是成为一种势不可挡的趋势。在图片分享及评价的要求下,开发一款整体式结构的图片分享及评价系统,将复杂的系统进行拆分,能够实现对需求的变化快速响应、系统稳定性的保障,能保证平台可持续、规模化发展的

java毕设项目足球信息发布平台(java+vue+mybatis+maven+mysql)_卓远科技的博客-爱代码爱编程

项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: Springboot + mybatis + Maven + Vue 等等组成,B/S模式 + Maven管理等等

c++ map / multimap容器_zhichao_97的博客-爱代码爱编程

目录 1. map基本概念 2. map构造和赋值 3. map大小和交换 4. map插入和删除 5. map查找和统计 6. map容器排序 1. map基本概念 简介:         map中所有元素都是pair         pair中第一个元素为key(键值),起到索引作用,第二个元素为value (实值)    

android 开发必会的7个gradle实用技巧_小米椒……的博客-爱代码爱编程

好文推荐: 作者:RicardoMJiang 转载地址:https://juejin.cn/post/6947675376835362846 前言 Gradle在android开发中应用地十分广泛,但相信有很多

jvm_调优_full thread dump java hotspot(tm) 64-爱代码爱编程

目录 1.cpu100%  2.内存100%问题 3.连接100% 前言:搞jvm调优【主要解决内存问题】,需要先搞定调优的区域 首先理解java的jvm运行时区域图  以及所用的jvm垃圾回收器 在【什么时间】 【哪里】 【做了什么】 问题:cpu100%  内存100%  数据库连接不够用(Connection问题)  都和jv