Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++에서 겹침을 제거하기 위해 제거할 최소 간격 수를 찾는 프로그램

<시간/>

간격 집합이 있다고 가정합니다. 나머지 구간이 겹치지 않게 하기 위해 제거해야 하는 최소 구간 수를 찾아야 합니다. 따라서 간격이 [[8,10],[3,5],[6,9]]이면 출력은 1이 됩니다. 다른 모든 항목이 겹치지 않게 하려면 [6,9]를 제거해야 하기 때문입니다. .

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • n :=배열의 크기
  • n이 0이면 0을 반환
  • 카운트:=1
  • 간격의 종료 시간을 기준으로 배열 정렬
  • end :=첫 번째 간격의 종료 날짜
  • 1 ~ n – 1 범위의 i에 대해
    • arr[i]의 시작 시간>=end이면
      • 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 = {{8,10},{3,5},{6,9}};
   Solution ob;
   cout << (ob.eraseOverlapIntervals(v));
}

입력

{{8,10},{3,5},{6,9}}

출력

1