解題思路:
/**
* 思路:
* 1、如果二維數組長度等於0或者1,直接返回當前數組
* 2、
* 2.1、數組size > 1,先按照區間的起始點生序排序
* 2.2、定義臨時變量(tempStart、tempEnd)記錄前一個數組的開始點和結束點,從第二個數組開始遍歷比較
* 2.3、如果tempStart <= numsNew[i][0] && tempEnd >= numsNew[i][0],tempEnd=tempEnd跟numsNew[i][1]的最大值
* 臨時區間不包含當前區間,則記錄臨時區間,然後臨時區間的開始、結束點=當前區間的開始和結束點
* 2.4、nums.isEmpty() || nums.get(nums.size() - 1)[0] != tempStart,需要記錄當前區間
* */
package com.cn.dl.leetcode;
import java.util.*;
/**
* Created by yanshao on 2020-02-18.
*/
public class Merge {
public static int[][] merge(int[][] intervals) {
if(intervals.length == 0 || intervals.length == 1){
return intervals;
}
List<int[]> nums = new ArrayList<>();
int[][] numsNew = sort(intervals);
int tempStart = numsNew[0][0];
int tempEnd = numsNew[0][1];
for(int i = 1; i < numsNew.length; i++){
if(tempStart <= numsNew[i][0] && tempEnd >= numsNew[i][0]){
tempEnd = Math.max(tempEnd,numsNew[i][1]);
}else {
nums.add(new int[]{tempStart,tempEnd});
tempStart = numsNew[i][0];
tempEnd = numsNew[i][1];
}
}
/**
* 數組=new int[][]{{1,4},{1,4},{1,4}}
* 或者數組最後一個區間不在前面數組包含
* 這兩個情況下,需要記錄當前區間
* */
if(nums.isEmpty() || nums.get(nums.size() - 1)[0] != tempStart){
nums.add(new int[]{tempStart,tempEnd});
}
return nums.toArray(new int[nums.size()][]);
}
private static int[][] sort(int[][] intervals){
List<int[]> intervalsList = Arrays.asList(intervals);
intervalsList.sort(Comparator.comparingInt(o -> o[0]));
return intervalsList.toArray(new int[intervalsList.size()][]);
}
public static void main(String[] args) {
// int[][] nums = new int[][]{{1,4},{1,4},{1,4}};
int[][] nums = new int[][]{{1,4},{0,4},{-1,3},{2,3}};
// int[][] numsNew = merge(nums);
// System.out.println(numsNew);
}
}
我的方法跟大神不能相提並論,但是不管自己的方法多麼複雜,都是自己的產出,日積月累,終會有提升,而且可以看到自己跟大神的差距!有興趣的朋友,可以加個QQ,我們一起學習,一起coding!