Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ช่วงที่ไม่ทับซ้อน (Non-overlapping Intervals) ใน C++

ช่วงที่ไม่ทับซ้อน (Non-overlapping Intervals)

ให้ชุดของช่วง (intervals) หาจำนวนช่วงน้อยที่สุดที่ต้องลบเพื่อให้ช่วงที่เหลือไม่ทับซ้อนกัน

ตัวอย่าง: [[1,2],[2,3],[3,4],[1,3]] → ลบ [1,3] 1 ช่วง เหลือ [1,2],[2,3],[3,4] ที่ไม่ทับซ้อน

ขั้นตอนการแก้ปัญหา (Greedy: Interval Scheduling)

  1. ถ้าอาร์เรย์ว่าง คืนค่า 0
  2. เรียงช่วงตาม end time จากน้อยไปมาก
  3. end = arr[0][1], count = 1
  4. วน i = 1 ถึง n-1:
    • ถ้า arr[i][0] >= end: end = arr[i][1], count++
  5. คืนค่า n - count (จำนวนที่ต้องลบ)

ตัวอย่างโค้ด C++

#include <bits/stdc++.h>
using namespace std;

class Solution {
public:
    int eraseOverlapIntervals(vector<vector<int>>& intervals) {
        if (intervals.empty()) return 0;
        sort(intervals.begin(), intervals.end(), [](auto& a, auto& b) {
            return a[1] < b[1];
        });
        int cnt = 1, end = intervals[0][1];
        for (int i = 1; i < intervals.size(); i++) {
            if (intervals[i][0] >= end) {
                end = intervals[i][1];
                cnt++;
            }
        }
        return intervals.size() - cnt;
    }
};

อินพุทและเอาต์พุทตัวอย่าง

Input: [[1,2],[1,2],[1,2]]

Output: 2