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

C++で正しい間隔を見つける


区間iごとに、区間iの始点が区間iの終点以上である区間jが存在するかどうかを確認します。 jはiの「右側」にあると呼ばれます。任意の区間iについて、最小区間jのインデックスを保存する必要があります。これは、区間jが区間iの「正しい」関係を構築するための最小開始点を持っていることを示します。区間jが存在しない場合は、区間iに-1を格納します。そして最後に、各間隔の保存された値を配列として出力する必要があります。したがって、入力が[[3,4]、[2,3]、[1,2]]のようである場合、[3にはそのような正しい間隔がないため、出力は[-1、0、1]になります。 、4]、区間[2,3]の場合、区間[3,4]には最小-「正しい」開始点があります。また、[1,2]の場合、区間[2,3]には最小の「正しい」開始点があります。

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

  • n:=間隔配列のサイズ、サイズnのam配列retを作成し、-1を使用してこれを埋め、mと呼ばれるマップを作成します

  • 0から間隔のサイズまでの範囲のiの場合

    • 間隔[i、0]がmの場合、次の間隔にスキップします

    • m [intervals [i、0]]:=i + 1

  • n –1からi>=0

    までの範囲のiの場合
    • it:=最小のキーを持つが、intervals [i、1]

      以上のキーと値のペアを指す
    • 値が0の場合は、次の反復に進みます

    • ret [i]:=その値– 1

  • retを返す

例(C ++)

理解を深めるために、次の実装を見てみましょう-

#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<auto> v){
   cout << "[";
   for(int i = 0; i<v.size(); i++){
      cout << v[i] << ", ";
   }
   cout << "]"<<endl;
}
class Solution {
public:
   vector<int> findRightInterval(vector<vector<int>>& intervals) {
      int n = intervals.size();
      vector <int> ret(n, -1);
      map <int, int< m;
      for(int i = 0; i < intervals.size(); i++){
         if(m.count(intervals[i][0])) continue;
         m[intervals[i][0]] = i + 1;
      }
      for(int i = n - 1; i >= 0; i--){
         map <int, int> :: iterator it = m.lower_bound(intervals[i][1]);
         if(it->second == 0) continue;
         ret[i] = it->second - 1;
      }
      return ret;
   }
};
main(){
   vector<vector<int>> v = {{3,4},{2,3},{1,2}};
   Solution ob;
   print_vector(ob.findRightInterval(v));
}

入力

[[3,4],[2,3],[1,2]]

出力

[-1,0,1]

  1. C++で特定のキーの次の右ノードを検索します

    この問題では、バイナリツリーBTとキー値が与えられます。私たちのタスクは、特定のキーの次の正しいノードを見つけることです。 バイナリツリーは、データストレージの目的で使用される特別なデータ構造です。 問題を理解するために例を見てみましょう 入力 key = 4 出力 5 説明 ノード4の隣の要素は5です。 ソリューションアプローチ この問題の簡単な解決策は、レベル順トラバーサルを使用してバイナリツリーをトラバースすることです。そして、与えられたキー値について、トラバーサルの同じレベルでノードの隣にノードが存在するかどうかを確認します。はいの場合は次のノードを返し、そうでない場合

  2. C++で重複するサブツリーを検索する

    二分木があるとします。重複するすべてのサブツリーを見つける必要があります。したがって、重複するサブツリーの種類ごとに、それらのいずれかのルートノードを返す必要があります。したがって、-のようなツリーがあるとします。 重複するサブツリーは-です これを解決するには、次の手順に従います- 配列retを作成し、マップを作成しますm 再帰メソッドsolve()を定義します。これはノードを入力として受け取ります。これは次のように機能します- ノードがnullの場合、-1を返します x:=ノードの値を文字列として、「#」を連結します。 左:=ソルブ(ノードの左)、右:=ソルブ(ノード