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

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

  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つの一時

  2. バイナリツリーに、C++でサイズ2以上の重複するサブツリーが含まれていないかどうかを確認します

    二分木があると考えてください。ツリーにサイズ2以上の重複するサブツリーがあるかどうかを確認する必要があります。以下のような二分木があるとします- サイズ2の2つの同一のサブツリーがあります。ツリーのシリアル化とハッシュプロセスを使用して、この問題を解決できます。アイデアは、サブツリーを文字列としてシリアル化し、ハッシュテーブルに格納することです。リーフではなく、ハッシュテーブルにすでに存在するシリアル化されたツリーを見つけたら、trueを返します。 例 #include <iostream> #include <unordered_set> using name