給出一個(gè)區(qū)間的集合,請合并所有重疊的區(qū)間。示例 1:
輸入: [[1,3],[2,6],[8,10],[15,18]]
輸出: [[1,6],[8,10],[15,18]]
解釋: 區(qū)間 [1,3] 和 [2,6] 重疊, 將它們合并為 [1,6].
示例?2:輸入: [[1,4],[4,5]]
輸出: [[1,5]]
解釋: 區(qū)間 [1,4] 和 [4,5] 可被視為重疊區(qū)間。
主要是找到這個(gè)規(guī)律,在一段區(qū)間內(nèi),沒有出現(xiàn)左右相等的情況,只取左右就可以
public int[][] merge(int[][] intervals) { List<Integer> l1=new ArrayList(); List<Integer> l2=new ArrayList(); for(int[] a:intervals){ l1.add(a[0]); l2.add(a[1]); } Collections.sort(l1); Collections.sort(l2); LinkedList<Integer> left=new LinkedList(l1); LinkedList<Integer> right=new LinkedList(l2); Stack<Integer> stack=new Stack(); List<int[]> ret=new ArrayList(); while(!left.isEmpty() || !right.isEmpty()){ int l=Integer.MAX_VALUE; int r=Integer.MAX_VALUE; if(!left.isEmpty()) l=left.peek(); if(!right.isEmpty()) r=right.peek(); if(l<=r){ stack.add(l); left.poll(); }else{ right.poll(); int t=stack.pop(); if(stack.isEmpty()) ret.add(new int[]{t,r}); } } int[][] ret1=new int[ret.size()][2]; for(int i=0;i<ret.size();i++){ ret1[i]=ret.get(i); } return ret1;}
解沒問題,但代碼太挫了,參考另一個(gè)比較好看的解法
public int[][] merge(int[][] intervals) { List<int[]> list=new ArrayList(); if(intervals.length==0) return list.toArray(new int[0][]); Arrays.sort(intervals,Comparator.comparingInt(o->o[0])); for(int i=0;i<intervals.length;i++){ if(list.size()==0 || intervals[i][0]>list.get(list.size()-1)[1]) list.add(intervals[i]); else list.get(list.size()-1)[1]=Math.max(list.get(list.size()-1)[1],intervals[i][1]); } return list.toArray(new int[0][]);}
聯(lián)系客服