题目链接
法一(排序)
public int[][] merge(int[][] intervals) {
if (intervals.length == 0) {
return new int[0][2];
}
Arrays.sort(intervals, (v1, v2) -> v1[0] - v2[0]);
List<int[]> merge = new ArrayList<>();
for (int[] interval : intervals) {
int pre = merge.size() - 1;
if (merge.size() == 0 || merge.get(pre)[1] < interval[0]) {
merge.add(interval);
} else {
merge.get(pre)[1] = Math.max(merge.get(pre)[1], interval[1]);
}
}
return merge.toArray(new int[0][]);
}
法二(位图)
public int[][] merge_2(int[][] intervals) {
BitSet bit = new BitSet();
int max = 0;
for (int[] interval : intervals) {
int start = interval[0] * 2;
int end = interval[1] * 2 + 1;
bit.set(start, end, true);
max = Math.max(max, end);
}
int index = 0, cnt = 0;
while (index < max) {
int start = bit.nextSetBit(index);
int end = bit.nextClearBit(start);
intervals[cnt++] = new int[]{start / 2, (end - 1) / 2};
index = end;
}
int[][] ans = new int[cnt][2];
System.arraycopy(intervals, 0, ans, 0, cnt);
return ans;
}
本地测试
lay.showTitle(56);
Solution56 sol56 = new Solution56();
int[][] intervals56 = new int[][]{{1, 3}, {2, 6}, {8, 10}, {15, 18}};
arrayOpt.showIntTwoDimArray(intervals56, intervals56.length);
int[][] ans56_1 = sol56.merge(intervals56);
int[][] ans56_2 = sol56.merge_2(intervals56);
arrayOpt.showIntTwoDimArray(ans56_1, ans56_1.length);
arrayOpt.showIntTwoDimArray(ans56_2, ans56_2.length);