C++のDuplicateIIIが含まれています
整数の配列があるとすると、nums[i]とnums[j]の絶対差が大きくなるように、配列に2つの異なるインデックスiとjがあるかどうかを確認する必要があります。はせいぜいtです。そして、iとjの絶対差は最大でkです。したがって、入力が[1,2,3,1]のようである場合、k=3およびt=0の場合、trueを返します。
これを解決するには、次の手順に従います-
-
セットを作成しますs、n:=nums配列のサイズ
-
0からn–1の範囲のiの場合
-
xは、nums[i]以上で始まる集合要素のインデックスです
-
xがx<=nums [i] + tのセットと値の範囲内にない場合は、trueを返します
-
xが最初の要素でない場合
-
x:=ランダムとしての次の要素
-
xから始まるt番目の要素が>=nums [i]の場合、trueを返します
-
-
nums [i]をsに挿入し、nums[i-k]をsから削除します
-
-
falseを返す
例(C ++)
理解を深めるために、次の実装を見てみましょう-
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
bool containsNearbyAlmostDuplicate(vector<int>& nums, int k, int t) {
multiset <int> s;
int n = nums.size();
for(int i = 0; i< n; i++){
multiset <int> :: iterator x = s.lower_bound(nums[i]);
if(x != s.end() && *x <= nums[i] + t ) return true;
if(x != s.begin()){
x = std::next(x, -1);
if(*x + t >= nums[i])return true;
}
s.insert(nums[i]);
if(i >= k){
s.erase(nums[i - k]);
}
}
return false;
}
};
main(){
Solution ob;
vector<int> v = {1,2,3,1};
cout << (ob.containsNearbyAlmostDuplicate(v, 3,0));
} 入力
[1,2,3,1] 3 0
出力
1
-
C++でのパス合計III
各ノードが整数キーを保持する二分木を与えたと仮定します。合計して特定の値になるパスを見つける必要があります。パスはルートからリーフまで開始する必要があります。合計が同じになるパスを見つける必要があります。 ツリーが[5,4,8,11、null、13,4,7,2、null、null、5,1]のようで、合計が22の場合、-になります。 パスは[[5,4,11,2]、[5,8,4,5]]です。 これを解決するには、次の手順に従います- この問題を解決するには、dfs関数を使用します。dfsはわずかに変更されています。これは次のように機能します。この関数は、ルート、合計、および1つの一時
-
バイナリツリーに、C++でサイズ2以上の重複するサブツリーが含まれていないかどうかを確認します
二分木があると考えてください。ツリーにサイズ2以上の重複するサブツリーがあるかどうかを確認する必要があります。以下のような二分木があるとします- サイズ2の2つの同一のサブツリーがあります。ツリーのシリアル化とハッシュプロセスを使用して、この問題を解決できます。アイデアは、サブツリーを文字列としてシリアル化し、ハッシュテーブルに格納することです。リーフではなく、ハッシュテーブルにすでに存在するシリアル化されたツリーを見つけたら、trueを返します。 例 #include <iostream> #include <unordered_set> using name