使用Arrays.Sort并定制Comparator排序解決合并區間

合并區間-力扣算法題56題

以數組?intervals?表示若干個區間的集合,其中單個區間為?intervals[i] = [starti, endi]?。請你合并所有重疊的區間,并返回?一個不重疊的區間數組,該數組需恰好覆蓋輸入中的所有區間?。

示例 1:

輸入:intervals = [[1,3],[2,6],[8,10],[15,18]]
輸出:[[1,6],[8,10],[15,18]]
解釋:區間 [1,3] 和 [2,6] 重疊, 將它們合并為 [1,6].

示例?2:

輸入:intervals = [[1,4],[4,5]]
輸出:[[1,5]]
解釋:區間 [1,4] 和 [4,5] 可被視為重疊區間。

提示:

  • 1 <= intervals.length <= 104
  • intervals[i].length == 2
  • 0 <= starti <= endi <= 104

java實現算法代碼

class Solution {public int[][] merge(int[][] intervals) {if (intervals.length == 0) {return new int[0][2];}Arrays.sort(intervals, new Comparator<int[]>() {public int compare(int[] interval1, int[] interval2) {return interval1[0] - interval2[0];}});List<int[]> merged = new ArrayList<int[]>();for (int i = 0; i < intervals.length; ++i) {int L = intervals[i][0], R = intervals[i][1];if (merged.size() == 0 || merged.get(merged.size() - 1)[1] < L) {merged.add(new int[]{L, R});} else {merged.get(merged.size() - 1)[1] = Math.max(merged.get(merged.size() - 1)[1], R);}}return merged.toArray(new int[merged.size()][]);}
}

算法思路(力扣的思路)

如果我們按照區間的左端點排序,那么在排完序的列表中,可以合并的區間一定是連續的。如下圖所示,標記為藍色、黃色和綠色的區間分別可以合并成一個大區間,它們在排完序的列表中是連續的:?

?

算法

我們用數組 merged 存儲最終的答案。

首先,我們將列表中的區間按照左端點升序排序。然后我們將第一個區間加入 merged 數組中,并按順序依次考慮之后的每個區間:

如果當前區間的左端點在數組 merged 中最后一個區間的右端點之后,那么它們不會重合,我們可以直接將這個區間加入數組 merged 的末尾;

否則,它們重合,我們需要用當前區間的右端點更新數組 merged 中最后一個區間的右端點,將其置為二者的較大值。

正確性證明

上述算法的正確性可以用反證法來證明:在排完序后的數組中,兩個本應合并的區間沒能被合并,那么說明存在這樣的三元組 (i,j,k) 以及數組中的三個區間 a[i],a[j],a[k]?滿足 i<j<k?并且 (a[i],a[k])可以合并,但 (a[i],a[j])?和 (a[j],a[k]) 不能合并。這說明它們滿足下面的不等式:

a[i].end<a[j].start(a[i]?和?a[j]?不能合并)a[j].end<a[k].start(a[j]?和?a[k]?不能合并)a[i].end≥a[k].start(a[i]?和?a[k]?可以合并)
????????????????????????a[i].end<a[j].start(a[i]?和?a[j]?不能合并)
????????????????????????a[j].end<a[k].start(a[j]?和?a[k]?不能合并)
????????????????????????a[i].end≥a[k].start(a[i]?和?a[k]?可以合并)
我們聯立這些不等式,可以得到:

????????????????????????????????????????a[i].end<a[j].start≤a[j].end<a[k].start
產生了矛盾!這說明假設是不成立的。因此,所有能夠合并的區間都必然是連續的。

我的思路

1.先判斷該?intervals是否為空,為空則返回一個空的二維數組int[0][2]

2.不為空的話,先用Array.sort(T[] a,Comparator<? super T> c)來定制一個只比較數組的最左端并使用升序排序的Compare排序器

3.之后將二維數組封裝在一個List集合里面,進行下一步比較

4.有兩種情況

????????4.1. 如果第一個區間的最右端的值小于下一個區間的最左端的值,則在List集合中再添加一個區間

? ? ? ? 4.2. 如果第一個區間的最右端的值大于等于下一個區間最左端的值,則將第一個區間最右端的值修改為下一個區間最右端的值

5.將List轉換為數組并以二維數組的形式返回即可

使用方法Arrays.sort和Comprator

Arrays.sort使用文檔

  • public static?<T>?void?sort?(T[]?a, Comparator<? super T>?c)
    • 根據指定比較器引發的順序對指定的對象數組進行排序。 數組中的所有元素都必須是指定比較相互比較的 (即, c.compare(e1, e2)不得拋出ClassCastException任何元件e1e2陣列中)。

      這種保證是穩定的 :相同的元素不會因排序而重新排序。

      實現注意事項:此實現是一個穩定的,自適應的迭代合并輸出,當輸入數組部分排序時,需要遠遠少于n lg(n)的比較,同時在輸入數組隨機排序時提供傳統mergesort的性能。 如果輸入數組幾乎排序,則實現需要大約n次比較。 臨時存儲要求從幾乎排序的輸入數組的小常量到隨機排序的輸入數組的n / 2個對象引用不等。

      該實現在其輸入數組中具有升序和降序的相同優勢,并且可以利用同一輸入數組的不同部分中的升序和降序。 它非常適合合并兩個或多個排序數組:只需連接數組并對結果數組進行排序。

      參數類型

      T - 要排序的對象的類

      參數

      a - 要排序的數組

      c - 用于確定陣列順序的比較器。 null值表示應使用元素' natural ordering 。

      異常

      ClassCastException - 如果數組包含使用指定比較器無法 相互比較的元素

      IllegalArgumentException - (可選)如果發現比較器違反了Comparator合同

?Comprator使用文檔

  • public interface Comparator<T>
    比較函數,它對某些對象集合施加總排序 。 可以將比較器傳遞給排序方法(例如Collections.sortArrays.sort ),以便精確控制排序順序。 比較器還可用于控制某些數據結構的順序(例如sorted setssorted maps ),或者為沒有natural ordering的對象集合提供排序。

    比較器c對一組元素S施加的排序被認為與等號一致,當且僅當c.compare(e1, e2)==0具有與e1.equals(e2)e1e2S中的S相同的布爾值時。

    當使用能夠強加與equals不一致的排序的比較器來排序有序集(或有序映射)時,應該謹慎行事。 假設具有顯式比較器c的有序集(或有序映射)與從集合S提取的元素(或鍵) S 。 如果cS的排序與equals不一致,則排序集(或有序映射)將表現得“奇怪”。 特別是有序集(或有序映射)將違反集合(或映射)的一般合同,其定義為equals

    例如,假設有兩個元素ab ,使(a.equals(b) && c.compare(a, b) != 0)為空TreeSet ,比較器為c 。 第二個add操作將返回true(并且樹集的大小將增加)因為ab在樹集的視角中不相等,即使這與Set.add方法的規范相反。

    注意:這通常是一個好主意比較,也能實現java.io.Serializable ,因為它們可能被用來作為排序的序列化數據結構的方法(如TreeSetTreeMap )。 為了使數據結構成功序列化,比較器(如果提供)必須實現Serializable

    對于數學上的傾斜,即限定了施加順序給定的比較器的關系 c上一組給定對象強加S是:

      {(x, y) such that c.compare(x, y) <= 0}. 
    此總訂單的是:
      {(x, y) such that c.compare(x, y) == 0}. 
    它從合同緊跟compare ,該商數是一個等價關系 S ,并且實行排序是全序 S 。 當我們說cS施加的排序與equals一致時 ,我們的意思是排序的商是由對象' equals(Object)方法定義的等價關系:
      {(x, y) such that x.equals(y)}. 

    Comparable不同,比較器可以選擇允許比較空參數,同時保持對等關系的要求。

聲明

部分算法思路摘自力扣(位置在算法思路這個目錄里),其余均為個人創作

作者:力扣官方題解
鏈接:https://leetcode.cn/problems/merge-intervals/
來源:力扣(LeetCode)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/165464.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/165464.shtml
英文地址,請注明出處:http://en.pswp.cn/news/165464.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

新能源行業碳酸氫鋰純化除鈣鎂工藝

在碳酸氫鋰純化中常規的沉淀或者其它工藝不能夠滿足鈣鎂等堿土金屬的深度去除。通常采用離子交換工藝實現鈣離子、鎂離子的去除&#xff0c;以提升碳酸鋰的品質&#xff0c;但是國產樹脂在此行業應用中存在的使用量過大的問題&#xff0c;會導致設備造價偏高、廢水量太大&#…

C++二分向量算法:最多可以參加的會議數目 II

本題的其它解法 C二分算法&#xff1a;最多可以參加的會議數目 II 本文涉及的基礎知識點 二分查找算法合集 題目 給你一個 events 數組&#xff0c;其中 events[i] [startDayi, endDayi, valuei] &#xff0c;表示第 i 個會議在 startDayi 天開始&#xff0c;第 endDayi …

gitt開源項目的意義,公司為什么會對在gitt上有開源項目的人更大機會

Git是一種分布式版本控制系統&#xff0c;它可以幫助程序員管理代碼的歷史版本和協同工作。同時&#xff0c;Git也成為了開源項目的主要托管平臺之一。Git的開源項目意義重大&#xff0c;因為這種開源項目托管平臺可以幫助開發者將代碼和項目分享給全球的開發者&#xff0c;并且…

從0開始學習JavaScript--JavaScript元編程

JavaScript作為一門靈活的動態語言&#xff0c;具備強大的元編程能力。元編程是一種通過操作程序自身結構的編程方式&#xff0c;使得程序能夠在運行時動態地創建、修改、查詢自身的結構和行為。本文將深入探討JavaScript中元編程的各個方面&#xff0c;包括原型、反射、代理等…

2023亞太杯數學建模C題思路模型代碼

已完成C題思路代碼&#xff0c;文末名片獲取 C題是我們的一個數據分析問題&#xff0c;這個題目主要就是我們要去收集數據&#xff0c;清洗處理后進行分析。 問題1&#xff1a;分析影響中國新能源電動汽車發展的主要因素&#xff0c;建立數學模型&#xff0c;描述這些因素對中…

對未來新能源車測試工具的看法

汽車行業正在經歷變革的說法算是比較輕描淡寫的了&#xff0c;還記得我1983年加入這個行業時&#xff0c;行業聚焦點是引入發動機管理系統。當時還是以家庭掀背車為主的時代&#xff0c;發動機分析儀的體積像衣柜一樣大&#xff0c;還沒出現“CAN”通信協議。現在經常聽到我的導…

PHP預約上門回收廢品系統的代碼披露

PHP預約上門回收廢品系統的代碼披露 <?phpnamespace app\admin\controller;class Code {public function getTopDomainhuo(){error_reporting(0);$host $_SERVER["HTTP_HOST"];$matchstr "[^\\.]\\.(?:(" . $host . ")|\\w{2}|((" . $ho…

【第一部分:概述】ARM Realm Management Monitor specification

目錄 概述機密計算系統軟件組成MonitorRealmRealm Management Monitor (RMM)Virtual Machine (VM)HypervisorSecure Partition Manager (SPM)Trusted OS (TOS)Trusted Application (TA) Realm Management Monitor 參考文獻 概述 RMM是一個軟件組件&#xff0c;它構成了實現ARM…

機器學習筆記 - 復雜任務的CNN組合

基礎CNN架構可通過多種方式進行組合和擴展,從而解決更多、更復雜的任務。 1. 分類和定位 在分類和定位任務中,你不僅需要說出在圖像中找到的物體的類別,而且還需指出物體顯現在圖像中的邊界框坐標。這類任務假設在圖像中只有一個物體實例。 這個任務可通過在典型的分類網絡…

每日一題(LeetCode)----鏈表--兩數相加

每日一題(LeetCode)----鏈表–兩數相加 1.題目&#xff08;2. 兩數相加&#xff09; 給你兩個 非空 的鏈表&#xff0c;表示兩個非負的整數。它們每位數字都是按照 逆序 的方式存儲的&#xff0c;并且每個節點只能存儲 一位 數字。 請你將兩個數相加&#xff0c;并以相同形式返…

深入ReentrantReadWriteLock(一)

一、為什么要出現讀寫鎖 synchronized和ReentrantLock都是互斥鎖。 如果說有一個操作是讀多寫少的&#xff0c;還要保證線程安全的話。如果采用上述的兩種互斥鎖&#xff0c;效率方面很定是很低的。 在這種情況下&#xff0c;咱們就可以使用ReentrantReadWriteLock讀寫鎖去實現…

React16中打印事件對象取不到值的現象及其原因分析

React16中打印事件對象取不到值的現象及其原因分析 一、背景 在最近的開發過程中&#xff0c;遇到了一個看起來匪夷所思的問題?&#xff1a; <Inputplaceholder"請輸入"onChange{(e) > {console.log(e:, e)}}onKeyDown{handleKeyDown} />此時按理來說我…

旅行商問題(枚舉,回溯,動態規劃,貪心,分支界限)

文章目錄 問題描述暴力枚舉回溯法動態規劃法貪心法分支界限法 問題描述 假設有一個貨郎擔要拜訪n個城市&#xff0c;他必須選擇所要走的路程&#xff0c;路程的限制時每個城市只能拜訪一次&#xff0c;而且最后要走到原來出發的城市&#xff0c;要求路徑長度。 旅行商問題將要…

為銷售賦能:利用 Splashtop 增強遠程培訓技術

遠程銷售團隊這一概念在當今快節奏的商業環境中日益普遍。各公司正在計劃在不同地點靈活開展銷售業務&#xff0c;希望利用技術優勢縮小地域差距。但是&#xff0c;這種向遠程銷售的轉型面臨著重大挑戰&#xff0c;尤其在培訓和發展領域。培訓遠程銷售團隊需要采用創新方法&…

常見樹種(貴州省):012茶、花椒、八角、肉桂、杜仲、厚樸、枸杞、忍冬

摘要&#xff1a;本專欄樹種介紹圖片來源于PPBC中國植物圖像庫&#xff08;下附網址&#xff09;&#xff0c;本文整理僅做交流學習使用&#xff0c;同時便于查找&#xff0c;如有侵權請聯系刪除。 圖片網址&#xff1a;PPBC中國植物圖像庫——最大的植物分類圖片庫 一、茶 灌…

鴻蒙 ark ui 輪播圖實現教程

前言&#xff1a; 各位同學有段時間沒有見面 因為一直很忙所以就沒有去更新博客。最近有在學習這個鴻蒙的ark ui開發 因為鴻蒙不是發布了一個鴻蒙next的測試版本 明年會啟動純血鴻蒙應用 所以我就想提前給大家寫一些博客文章 效果圖 具體實現 我們在鴻蒙的ark ui 里面列表使…

土地利用數據技術服務

一、背景介紹 土地是人類賴以生存與發展的重要資源和物質保障&#xff0c;在“人口&#xff0d;資源&#xff0d;環境&#xff0d;發展&#xff08;PRED&#xff09;”復合系統 中&#xff0c;土地資源處于基礎地位。隨著現代社會人口的不斷增長以及工業化、城市化進程的加速&a…

Excel使用VLOOKUP查詢數據

VLOOKUP函數在百度百科中的解釋是&#xff1a; 解釋一下&#xff0c;函數需要4個參數&#xff1a; 參數1&#xff08;lookup_value&#xff09;&#xff1a;需要匹配的值參數2&#xff08;table_array&#xff09;&#xff1a;在哪個區域里進行匹配參數3&#xff08;col_index…

Dubbo3使用Zookeeper作為注冊中心的方案討論!詳解DubboAdmin與PrettyZoo來監控服務的優劣!

文章目錄 一&#xff1a;Dubbo注冊中心的基本使用 二&#xff1a;Zookeeper注冊中心的使用 1&#xff1a;依賴引入 2&#xff1a;實際開發 三&#xff1a;Zookeeper作為注冊中心的使用展示 1&#xff1a;啟動注冊Zookeeper服務 2&#xff1a;引入注冊中心 (一)&#xf…