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]
-
C++で特定のキーの次の右ノードを検索します
この問題では、バイナリツリーBTとキー値が与えられます。私たちのタスクは、特定のキーの次の正しいノードを見つけることです。 バイナリツリーは、データストレージの目的で使用される特別なデータ構造です。 問題を理解するために例を見てみましょう 入力 key = 4 出力 5 説明 ノード4の隣の要素は5です。 ソリューションアプローチ この問題の簡単な解決策は、レベル順トラバーサルを使用してバイナリツリーをトラバースすることです。そして、与えられたキー値について、トラバーサルの同じレベルでノードの隣にノードが存在するかどうかを確認します。はいの場合は次のノードを返し、そうでない場合
-
C++で重複するサブツリーを検索する
二分木があるとします。重複するすべてのサブツリーを見つける必要があります。したがって、重複するサブツリーの種類ごとに、それらのいずれかのルートノードを返す必要があります。したがって、-のようなツリーがあるとします。 重複するサブツリーは-です これを解決するには、次の手順に従います- 配列retを作成し、マップを作成しますm 再帰メソッドsolve()を定義します。これはノードを入力として受け取ります。これは次のように機能します- ノードがnullの場合、-1を返します x:=ノードの値を文字列として、「#」を連結します。 左:=ソルブ(ノードの左)、右:=ソルブ(ノード