Leetcode 57、插入区间

思路:二分查找+区间合并
- 把intervals数组添加都list里面
- 调用getIndex使用二分查找法找到newInterval应该插入的位置
- 把newInterval插入到list对应的位置
- 对list进行区间合并,如果i和i + 1有交叉,则进行合并
- 把list转成int[][],返回结果
class Solution {
public int[][] insert(int[][] intervals, int[] newInterval) {
if(intervals.length == 0) {
int[][] result = new int[1][2];
result[0] = newInterval;
return result;
}
List<int[]> list = new ArrayList<>();
for(int[] interval : intervals) {
list.add(interval);
}
int index = getIndex(list, newInterval);
list.add(index, newInterval);
for(int i = 0; i < list.size() - 1; i++) {
if(list.get(i + 1)[0] <= list.get(i)[1]) {
int[] curr = list.get(i);
curr[1] = Math.max(list.get(i + 1)[1], list.get(i)[1]);
list.set(i, curr);
list.remove(i + 1);
i--;
}
}
int[][] result = new int[list.size()][2];
for(int i = 0; i < list.size(); i++) {
result[i] = list.get(i);
}
return result;
}
public int getIndex(List<int[]> list, int[] newInterval) {
int left = 0, right = list.size() - 1;
while(left <= right) {
int mid = (right - left) / 2 + left;
if(list.get(mid)[0] > newInterval[0]) {
right = mid - 1;
}else if(list.get(mid)[0] < newInterval[0]){
left = mid + 1;
}else{
return mid;
}
}
return left;
}
}