「學習筆記」子序列自動機
阿新 • • 發佈:2020-12-23
題目:
給出一個區間的集合,請合併所有重疊的區間。
示例 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 }