日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【LeetCode刷题】重叠区间问题

發布時間:2023/12/15 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【LeetCode刷题】重叠区间问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

跟著甜姨整理了這一類問題,沒有固定套路,但需要找規律以及細心。

重疊區間

252,會議室,easy

題解

實質是判斷有沒有重疊區間,將區間按照會議開始時間排序,然后遍歷一遍即可。

代碼

class Solution{public boolean canAttendMeetings(int[][] intervals){Arrays.sort(intervals, (v1, v2)->v1[0]-v2[0]);for(int i = 1; i < intervals.length; i++){if(intervals[i][0] < intervals[i - 1][1])return false;}return true;} }
56,合并區間,medium

題解

與上一題的區別在于要合并重疊的區間,還是從intervals的第一個元素開始遍歷,最開始比較的對象為intervals[0][1],在遍歷過程中不斷更新,此對象的含義為上一個區間的末尾。即新的區間的開頭比上一區間的末尾大,就不需要合并。

代碼

class Solution {public int[][] merge(int[][] intervals) {if(intervals.length == 1) return intervals;Arrays.sort(intervals, (v1, v2) -> v1[0] - v2[0]);int flag = intervals[0][1];int[][] res = new int[intervals.length + 1][2];int idx = 0;res[0] = intervals[0];for(int i = 1; i < intervals.length; i++){if(intervals[i][0] <= flag){res[idx][1] = Math.max(res[idx][1], intervals[i][1]);flag = res[idx][1];}else{res[++idx] = intervals[i];flag = intervals[i][1];}}return Arrays.copyOf(res, idx + 1);} }
57,插入區間,medium


題解

本題中的區間已經按照起始端點升序排列,因此我們直接遍歷區間列表,尋找新區間的插入位置即可。具體步驟如下:

  • 首先將新區間左邊且相離的區間加入結果集(遍歷時,如果當前區間的結束位置小于新區間的開始位置,說明當前區間在新區間的左邊且相離);
  • 接著判斷當前區間是否與新區間重疊,重疊的話就進行合并,直到遍歷到當前區間在新區間的右邊且相離,將最終合并后的新區間加入結果集;
  • 最后將新區間右邊且相離的區間加入結果集。
  • 代碼

    class Solution {public int[][] insert(int[][] intervals, int[] newInterval) {int pL = newInterval[0];int pR = newInterval[1];int[][] res = new int[intervals.length + 1][2];int i = 0;//[[1,2],[3,5],[6,7],[8,10],[12,16]]// 4 8//[[1,2],[3,10],[12,16]] int idx = 0;//無重疊部分while(i < intervals.length && intervals[i][1] < pL){res[idx++] = intervals[i++];}// 接著判斷當前區間是否與新區間重疊,重疊的話就進行合并,直到遍歷到當前區間在新區間的右邊且相離,// 將最終合并后的新區間加入結果集 while(i < intervals.length && intervals[i][0] <= pR){pL = Math.min(intervals[i][0], pL);pR = Math.max(intervals[i][1], pR);i++;}res[idx++] = new int[]{pL, pR};while(i < intervals.length){res[idx++] = intervals[i++];}return Arrays.copyOf(res, idx);} }
    1288,刪除被覆蓋區間,medium

    題解

    貪心

    先按區間左邊界升序排列,如果相等,按右區間降序排列(消除覆蓋區間)

    這樣只需要更新一個右邊界值即可

    遍歷區間,如果被覆蓋,區間數-1;如果沒有被覆蓋,則更新新的邊界值。

    代碼

    class Solution {public int removeCoveredIntervals(int[][] intervals) {if(intervals.length == 1) return 1;Arrays.sort(intervals, (v1, v2) -> v1[0] == v2[0] ? v2[1] - v1[1] : v1[0] - v2[0]);int res = intervals.length;int r = intervals[0][1];for(int i = 1; i < intervals.length; i++){if(intervals[i][1] <= r){res--;}else r = Math.max(r, intervals[i][1]);}return res;} }
    228,匯總區間,easy

    題解

    對連續的數字按固定格式輸出,那么雙指針找到不連續的數字即可。

    找到之后更新i = j + 1。

    在一個循環中判斷一下雙指針所指位置,如果相同則只添加一個元素。

    代碼

    class Solution {public List<String> summaryRanges(int[] nums) {//雙指針List<String> res = new ArrayList<>();if(nums.length == 0) return res;if(nums.length == 1){res.add(String.valueOf(nums[0]));return res;}int i = 0;for(int j = 0; j < nums.length; j++){//找到第一個不符合遞增規則的,或者遍歷完成if(j == nums.length - 1 || nums[j] + 1 != nums[j + 1]){String tmp = String.valueOf(nums[i]) + "->" + String.valueOf(nums[j]);if(nums[i] != nums[j])res.add(tmp);else res.add(String.valueOf(nums[j]));i = j + 1;}}return res;} }

    總結

    以上是生活随笔為你收集整理的【LeetCode刷题】重叠区间问题的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。