2023.8.4
开始思路是原地修改数组,结果超时了,代码如下:
class Solution {
public:
static bool cmp(vector<int>& a , vector<int>& b)
{
if(a[0] == b[0]) return a[1] < b[1];
return a[0] < b[0];
}
vector<vector<int>> merge(vector<vector<int>>& intervals) {
sort(intervals.begin(),intervals.end(),cmp);
for(int i=1; i<intervals.size(); i++)
{
if(intervals[i][0] <= intervals[i-1][1])
{
intervals[i][0] = min(intervals[i][0],intervals[i-1][0]);
intervals[i][1] = max(intervals[i][1],intervals[i-1][1]);
intervals.erase(intervals.begin()+i-1);
i--;
}
}
return intervals;
}
};
没法原地修改,只能重新建一个二维数组vector。 代码如下:
class Solution {
public:
static bool cmp(vector<int>& a , vector<int>& b)
{
if(a[0] == b[0]) return a[1] < b[1];
return a[0] < b[0];
}
vector<vector<int>> merge(vector<vector<int>>& intervals) {
sort(intervals.begin(),intervals.end(),cmp);
vector<vector<int>> ans;
ans.push_back(intervals[0]);
for(int i=1; i<intervals.size(); i++)
{
if(intervals[i][0] <= ans.back()[1])
{
ans.back()[1] = max(ans.back()[1],intervals[i][1]);
}
else
{
ans.push_back(intervals[i]);
}
}
return ans;
}
};
ps:当重叠时,只需要更新右边界,因为我们排序的时候是按左边界从小到大排序的。
2023.10.10
二刷。 java代码如下:
class Solution {
public int[][] merge(int[][] intervals) {
List<int[]> ans = new ArrayList<>();
// 自定义升序排序(左边大返回正数,左边小返回负数)
Arrays.sort(intervals,new Comparator<int[]>(){
public int compare(int[] interval1,int[] interval2){
return interval1[0]-interval2[0];
}
});
ans.add(intervals[0]);
for(int i=1; i<intervals.length; i++){
//有重叠区域
if(ans.get(ans.size()-1)[1] >= intervals[i][0]){
ans.get(ans.size()-1)[1] = Math.max(ans.get(ans.size()-1)[1],intervals[i][1]);
}
else{
ans.add(intervals[i]);
}
}
return ans.toArray(new int[ans.size()][]);
}
}