(LeetCode 面试经典 150 题) 57. 插入区间 (数组)
题目:57. 插入区间
思路:数组,时间复杂度0(n)。
先将newInterval左侧的区间都添加到v中,然后处理重复的区间,最后再将右侧的区间都加到v中即可。细节看注释。
C++版本:
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版本:
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版本:
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:=0for ;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
}