插一个之前字节问的列出所有的区间:
例:输入:[[1,3],[2,6],[8,10],[15,18]]
输出:
[8, 10]
[15, 18]
[1, 2]
[2, 3]
[3, 6]
solution
自己想的,建立优先队列,存有重复的,这样最小堆就可以往出取时建立区间,存入list中,没有重合的就直接存入list中。
public class merge56byteDance {
public static void main(String[] args) {
int[][] nums = {{1, 3}, {2, 6}, {8, 10}, {15, 18}};
int[][] res = merge(nums);
System.out.println(Arrays.deepToString(res));
}
private static int[][] merge(int[][] nums) {
if (nums == null || nums.length == 0 || nums[0].length == 0) return new int[0][0];
Arrays.sort(nums, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return o1[0] - o1[0];
}
});
PriorityQueue<Integer> queue = new PriorityQueue<>();
int list0 = nums[0][0];
int list1 = nums[0][1];
List<int[]> list = new ArrayList<>();
queue.add(list0);
queue.add(list1);
for (int i = 1; i < nums.length; i++) {
int[] curNum = nums[i];
if (curNum[0] < list1) {
queue.add(curNum[0]);
queue.add(curNum[1]);
list0 = curNum[0];
list1 = curNum[1];
}
else{
list.add(curNum);
}
}
int p1 = queue.poll();
while(!queue.isEmpty()){
int p2 = queue.poll();
list.add(new int[]{p1,p2});
p1 = p2;
}
return list.toArray(new int[list.size()-1][2]);
}
}