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:=ノードの値を文字列として、「#」を連結します。 左:=ソルブ(ノードの左)、右:=ソルブ(ノード