กำหนดรายการ intervals [start, end] ตรวจสอบว่ามี interval ไหนที่ "ครอบคลุม" interval อีกตัวหนึ่ง (คือ start ≤ other.start และ end ≥ other.end)
ตัวอย่าง: [[2,4],[5,11],[5,9],[10,10]] → true ([5,11] ครอบคลุม [5,9])
วิธีแก้ปัญหา
- เรียง intervals โดย
endขึ้น, ถ้า end เท่ากัน เรียงstartลง - วนลูปเก็บ intervals ที่ "ไม่ถูกครอบคลุม" ไว้ใน
ret - ถ้า interval ปัจจุบันมี
start ≤ ret.back().startแสดงว่าถูกครอบคลุม → คืนtrue
ตัวอย่างโค้ด C++
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
static bool cmp(vector<int>& a, vector<int>& b) {
return a[1] == b[1] ? a[0] > b[0] : a[1] < b[1];
}
bool solve(vector<vector<int>>& v) {
sort(v.begin(), v.end(), cmp);
vector<vector<int>> ret;
for(auto& it : v) {
if(ret.empty()) ret.push_back(it);
else if(ret.back()[0] >= it[0]) return true;
else ret.push_back(it);
}
return false;
}
};
int main() {
Solution ob;
vector<vector<int>> v = {{2,4},{5,11},{5,9},{10,10}};
cout << ob.solve(v);
}
Input
{{2,4},{5,11},{5,9},{10,10}}
Output
1