สมมติว่าเรามีชุดของช่วงเวลา เราต้องหาจำนวนช่วงขั้นต่ำที่เราจำเป็นต้องลบออกเพื่อให้ช่วงเวลาที่เหลือไม่ทับซ้อนกัน ดังนั้นหากช่วงเวลาคือ [1,2], [2,3], [3,4], [1,3]] ผลลัพธ์จะเป็น 1 ตามที่เราต้องลบ [1,3] เพื่อให้ ส่วนอื่นๆ ทั้งหมดไม่ทับซ้อนกัน
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
n :=ขนาดของอาร์เรย์
-
ถ้า n เป็น 0 ให้คืนค่า 0
-
นับ :=1
-
จัดเรียงอาร์เรย์ตามเวลาสิ้นสุดของช่วงเวลา
-
end :=วันที่สิ้นสุดของช่วงแรก
-
สำหรับฉันอยู่ในช่วง 1 ถึง n – 1
-
ถ้าเวลาเริ่มต้นของ arr[i]>=สิ้นสุด แล้ว
-
end :=เวลาสิ้นสุดของ arr[i]
-
เพิ่มจำนวนขึ้น 1
-
-
-
กลับ n – นับ
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
static bool cmp(vector <int>& a, vector <int>& b){
return a[1] < b[1];
}
int eraseOverlapIntervals(vector<vector<int>>& arr) {
int n = arr.size();
if(!n)return 0;
int cnt = 1;
sort(arr.begin(), arr.end(), cmp);
int end = arr[0][1];
for(int i = 1; i < n; i++){
if(arr[i][0] >= end){
end = arr[i][1];
cnt++;
}
}
return n - cnt;
}
};
main(){
vector<vector<int>> v = {{1,2},{1,2},{1,2}};
Solution ob;
cout << (ob.eraseOverlapIntervals(v));
} อินพุต
[[1,2],[1,2],[1,2]]
ผลลัพธ์
2