릿코드(LEETCODE)
56. Merge Intervals
cepiloth
2020. 2. 12. 13:34
반응형
https://leetcode.com/problems/merge-intervals/
2차원 벡터의 각각의 요소의 값이 겹치는 부분이 없도록 병합을 하는 문제.
input 이 몇 개가 들어오는지 명시되어 있지 않다. null 도 입력될 수 있으니 주의한다.
Source
입력으로 들어오는 vector의 요소는 순서가 보장되어 있지 않다. 오름 차순 정렬을 하고 overlap 되는 구간을 찾아 병합한다.
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
vector<vector<int>> vvi;
const int size = intervals.size();
if (size == 0) {
return vvi;
}
sort(intervals.begin(), intervals.end());
int prevLeft = intervals[0][0];
int prevRight = intervals[0][1];
vvi.push_back({ prevLeft, prevRight });
for (int i = 1; i < size; i++) {
int cntLeft = intervals[i][0];
int cntRight = intervals[i][1];
if (prevRight >= cntLeft) {
prevLeft = min(cntLeft, prevLeft);
prevRight = max(cntRight, prevRight);
if (false == vvi.empty()) {
vvi.pop_back();
}
}
else {
prevLeft = cntLeft;
prevRight = cntRight;
}
vvi.push_back({ prevLeft, prevRight });
}
return vvi;
}
};
24 ms 12.9 mb가 소모 됐다.
아래 구문에서 pop_back()을 제거해 보자.
if (prevRight >= cntLeft) {
prevLeft = min(cntLeft, prevLeft);
prevRight = max(cntRight, prevRight);
if (false == vvi.empty()) {
vvi.pop_back();
}
}
20 ms 12.4 mb 큰 차이가 없구먼;
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
vector<vector<int>> vvi;
const int size = intervals.size();
if (size == 0) {
return vvi;
}
sort(intervals.begin(), intervals.end());
int prevLeft = intervals[0][0];
int prevRight = intervals[0][1];
vvi.push_back({ prevLeft, prevRight });
for (int i = 1; i < size; i++) {
int cntLeft = intervals[i][0];
int cntRight = intervals[i][1];
if (prevRight >= cntLeft) {
prevLeft = min(cntLeft, prevLeft);
prevRight = max(cntRight, prevRight);
if (false == vvi.empty()) {
vvi[vvi.size() - 1][0] = prevLeft;
vvi[vvi.size() - 1][1] = prevRight;
} else {
vvi.push_back({ prevLeft, prevRight });
}
}
else {
prevLeft = cntLeft;
prevRight = cntRight;
vvi.push_back({ prevLeft, prevRight });
}
}
return vvi;
}
};
반응형