【LeetCode刷题】重叠区间问题
生活随笔
收集整理的這篇文章主要介紹了
【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刷题】重叠区间问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: XSLT基础 XSL 与 XSLT
- 下一篇: Maven手动导入依赖