1. 程式人生 > 實用技巧 >「學習筆記」子序列自動機

「學習筆記」子序列自動機

題目:

給出一個區間的集合,請合併所有重疊的區間。

示例 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] 可被視為重疊區間。

注意:輸入型別已於2019年4月15日更改。 請重置預設程式碼定義以獲取新方法簽名。

提示:

  • intervals[i][0] <= intervals[i][1]

程式碼:

 1 class Solution {
 2     public int[][] merge(int[][] intervals) {
 3        var arraylist=new ArrayList();
 4        int k=0;
 5        //先按照[i][0]排序       
 6        for(int i=intervals.length-1;i>=0;--i){
 7            boolean b=false;
 8            for(int j=1;j<=i;++j){
 9                if
(intervals[j][0]<intervals[j-1][0]){ 10 //swap 11 k=intervals[j][0]; 12 intervals[j][0]=intervals[j-1][0]; 13 intervals[j-1][0]=k; 14 15 k=intervals[j][1]; 16 intervals[j][1]=intervals[j-1][1];
17 intervals[j-1][1]=k; 18 b=true; 19 } 20 } 21 if(!b){break;} 22 } 23 24 k=0; 25 for(int i=0;i<intervals.length;){ 26 int j=i+1; 27 while(j<intervals.length){ 28 //[i][1]與[i+1][0],[i+1][1],有三種情況 29 if(intervals[i][1]>=intervals[j][0]&&intervals[i][1]<=intervals[j][1]){ 30 intervals[i][1]=intervals[j][1]; 31 ++j; 32 continue; 33 } 34 if(intervals[i][1]<intervals[j][0]){break;} 35 if(intervals[i][1]>intervals[j][1]){++j;} 36 } 37 intervals[k][0]= intervals[i][0]; 38 intervals[k][1]= intervals[i][1]; 39 i=j; 40 ++k; 41 } 42 return Arrays.copyOfRange(intervals,0,k); 43 44 } 45 }