題目:
以數組?intervals
?表示若干個區間的集合,其中單個區間為?intervals[i] = [starti, endi]
?。請你合并所有重疊的區間,并返回?一個不重疊的區間數組,該數組需恰好覆蓋輸入中的所有區間?。
示例 1:
輸入:intervals = [[1,3],[2,6],[8,10],[15,18]] 輸出:[[1,6],[8,10],[15,18]] 解釋:區間 [1,3] 和 [2,6] 重疊, 將它們合并為 [1,6].
解法:
1.排序:左端點或右端點排序;
2.根據排序后的結果,總結規律,進而得出解決這個問題的策略;
3.貪心策略:求并集
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;public class Solution {public int[][]merge(int[][]intervals){//按左端點排序Arrays.sort(intervals, Comparator.comparingInt(v -> v[0]));//合并區間,求并集int left=intervals[0][0],right=intervals[0][1];List<int[]>ret=new ArrayList<>();for(int i=1;i<intervals.length;i++){int a=intervals[i][0],b=intervals[i][1];if(a<=right)//有重疊部分{right=Math.max(right,b);}else//不能合并{ret.add(new int[]{left,right});left=a;right=b;}}ret.add(new int[]{left,right});return ret.toArray(new int[0][]);}public static void main(String[] args) {Solution solution=new Solution();int [][]intervals=new int[][]{new int[]{1,3},new int[]{2,6},new int[]{8,10},new int[]{15,18},};int [][] merged=solution.merge(intervals);for(int[] interval:merged){System.out.println(Arrays.toString(interval));}}}