【LeetCode】 57. Insert Interval 插入区间(Hard)(JAVA)
题目地址: https://leetcode.com/problems/insert-interval/
题目描述:
Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessary).
You may assume that the intervals were initially sorted according to their start times.
Example 1:
Input: intervals = [[1,3],[6,9]], newInterval = [2,5]
Output: [[1,5],[6,9]]
Example 2:
Input: intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]
Output: [[1,2],[3,10],[12,16]]
Explanation: Because the new interval [4,8] overlaps with [3,5],[6,7],[8,10].
NOTE: input types have been changed on April 15, 2019. Please reset to default code definition to get new method signature.
题目大意
给出一个无重叠的 ,按照区间起始端点排序的区间列表。
在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。
解题方法
newInterval 和 intervals[i] 存在三种情况,分别做处理即可
1、newInterval 完全大于 intervals[i]:intervals[len] = intervals[i]
2、newInterval 完全小于 intervals[i]:intervals[len] = newInterval, intervals[i] 为新的 newInterval
3、newInterval 与 intervals[i] 有交集:newInterval 为 newInterval 与 intervals[i] 的并集
class Solution {
public int[][] insert(int[][] intervals, int[] newInterval) {
int len = 0;
for (int i = 0; i < intervals.length; i++) {
if (intervals[i][0] > newInterval[1]) {
int[] temp = newInterval;
newInterval = intervals[i];
intervals[len] = temp;
len++;
} else if (intervals[i][1] < newInterval[0]) {
swap(intervals, len, i);
len++;
} else {
newInterval[0] = Math.min(intervals[i][0], newInterval[0]);
newInterval[1] = Math.max(intervals[i][1], newInterval[1]);
}
}
int[][] res = new int[len + 1][2];
for (int i = 0; i < len; i++) {
res[i] = intervals[i];
}
res[len] = newInterval;
return res;
}
public void swap(int[][] intervals, int i, int j) {
if (i == j || i >= intervals.length || j >= intervals.length) return;
int[] temp = intervals[i];
intervals[i] = intervals[j];
intervals[j] = temp;
}
}
执行用时 : 1 ms, 在所有 Java 提交中击败了 99.73% 的用户
内存消耗 : 41.9 MB , 在所有 Java 提交中击败了 31.21% 的用户