题目:57. 插入区间
思路:数组,时间复杂度0(n)。
先将newInterval左侧的区间都添加到v中,然后处理重复的区间,最后再将右侧的区间都加到v中即可。细节看注释。
C++版本:
cpp
class Solution {
public:
vector<vector<int>> insert(vector<vector<int>>& intervals, vector<int>& newInterval) {
// 答案
vector<vector<int>> v;
// intervals为空时,直接返回newInterval即可
if(intervals.size()==0){
v.push_back(newInterval);
return v;
}
// 先将newInterval左侧的区间都添加到v中
int l=newInterval[0],r=newInterval[1];
int i;
for(i=0;i<intervals.size();i++){
if(l>intervals[i][1]){
v.push_back(intervals[i]);
}else{
break;
}
}
// 然后处理重复的区间
if(i<intervals.size())l=min(intervals[i][0],l);
for(;i<intervals.size();i++){
if(r>=intervals[i][0]){
r=max(r,intervals[i][1]);
}else{
break;
}
}
v.push_back({l,r});
// 最后再将右侧的区间都加到v中
for(;i<intervals.size();i++){
v.push_back(intervals[i]);
}
return v;
}
};
JAVA版本:
java
class Solution {
public int[][] insert(int[][] intervals, int[] newInterval) {
List<int[]> v=new ArrayList<>();
if(intervals.length==0){
v.add(newInterval);
return v.toArray(new int[v.size()][]);
}
int l=newInterval[0],r=newInterval[1];
int i;
for(i=0;i<intervals.length;i++){
if(l>intervals[i][1]){
v.add(intervals[i]);
}else{
break;
}
}
if(i<intervals.length)l=Math.min(intervals[i][0],l);
for(;i<intervals.length;i++){
if(r>=intervals[i][0]){
r=Math.max(r,intervals[i][1]);
}else{
break;
}
}
v.add(new int[]{l,r});
for(;i<intervals.length;i++){
v.add(intervals[i]);
}
return v.toArray(new int[v.size()][]);
}
}
GO版本:
go
func insert(intervals [][]int, newInterval []int) [][]int {
v:=[][]int{}
if len(intervals)==0 {
v=append(v,newInterval)
return v
}
l,r:=newInterval[0],newInterval[1]
i:=0
for ;i<len(intervals);i++ {
if l>intervals[i][1] {
v=append(v,intervals[i])
}else{
break
}
}
if i<len(intervals) {
l=min(l,intervals[i][0])
}
for ;i<len(intervals);i++ {
if r>=intervals[i][0] {
r=max(r,intervals[i][1])
}else{
break
}
}
v=append(v,[]int{l,r})
for ;i<len(intervals);i++ {
v=append(v,intervals[i])
}
return v
}