C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++で重複しない間隔


間隔のコレクションがあるとします。残りの間隔が重ならないようにするために削除する必要のある間隔の最小数を見つける必要があります。したがって、間隔が[[1,2]、[2,3]、[3,4]、[1,3]]の場合、[1,3]を削除して作成する必要があるため、出力は1になります。他のすべては重複していません。

これを解決するには、次の手順に従います-

  • 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 = {{1,2},{1,2},{1,2}};
   Solution ob;
   cout << (ob.eraseOverlapIntervals(v));
}

入力

[[1,2],[1,2],[1,2]]

出力

2

  1. C++でのラインリフレクション

    2D平面上にn個の点があるとすると、指定された点を対称的に反射するy軸に平行な線があるかどうかを確認する必要があります。つまり、指定された線上にすべての点を反映した後に線が存在するかどうかを確認する必要があります。元のポイントのセットは、反映されたポイントと同じです。 したがって、入力がpoints =[[1,1]、[-1,1]]のような場合 その場合、出力はtrueになります これを解決するには、次の手順に従います- 1つのセットを定義します。 n:=ポイントのサイズ minVal:=inf maxVal:=-inf 初期化i:=0の場合、i <

  2. C++の対角トラバースII

    numsというリストのリストがあるとすると、numsのすべての要素を対角線順に表示する必要があります。 したがって、入力が次のような場合 その場合、出力は[1,6,2,8,7,3,9,4,12,10,5,13,​​11,14,15,16]になります。 これを解決するには、次の手順に従います- 配列retを定義する 1つの2Dアレイvを定義する 初期化i:=0の場合、i