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

C++でK番目に小さいペア距離を見つける


整数配列があるとします。すべてのペアの中でk番目に小さい距離を見つける必要があります。ペア(A、B)の距離は、実際にはAとBの絶対差です。したがって、入力が[1,3,8]の場合、可能なすべてのペアは[1,3]、[3、8]です。 、[1、8]、k =2の場合、2番目に小さい距離は5(8-3)です。

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

  • n:=numsのサイズ、x:=0
  • iを初期化する場合:=0、i
  • x:=xとnumsの最大値[i]
  • サイズx+1の配列cntを定義します
  • iを初期化する場合:=0、i
  • jを初期化する場合:=i + 1、j
  • cnt [| nums [j] --nums[i]|]を1増やします
  • iを初期化する場合:=0、i <=xの場合、更新(iを1つ増やす)、実行-
    • cnt [i]> =kの場合、-
      • 私を返す
    • k:=k --cnt [i]
  • return x
  • 理解を深めるために、次の実装を見てみましょう-

    #include <bits/stdc++.h>
    using namespace std;
    class Solution {
    public:
       int smallestDistancePair(vector<int>& nums, int k) {
          int n = nums.size();
          int x = 0;
          for(int i = 0; i < n; i++)x = max(x, nums[i]);
          vector <int> cnt(x + 1);
          for(int i = 0 ; i < n; i++){
             for(int j = i + 1; j < n; j++){
                cnt[abs(nums[j] - nums[i])]++;
             }
          }
          for(int i = 0; i <= x; i++){
             if(cnt[i] >= k)return i;
             k -= cnt[i];
          }
          return x;
       }
    };
    main(){
       Solution ob;
       vector<int> v = {1,3,8};
       cout << (ob.smallestDistancePair(v, 2));
    }

    入力

    {1,3,8}

    出力

    5

    1. C ++のBST(BSTの順序統計量)でk番目に小さい要素を検索します

      二分探索木があり、入力として値Kがあるとすると、ツリー内でK番目に小さい要素を見つける必要があります。 したがって、入力が次のような場合 k =3の場合、出力は15になります。 これを解決するには、次の手順に従います- 関数find_kth_smallest()を定義します。これは、root、count、k、を取ります。 ルートがNULLの場合、- NULLを返す left =find_kth_smallest(rootの左側、カウント、k) leftがNULLでない場合、- 左に戻る (カウントを1つ増やします) count

    2. C++でしきい値距離にある近隣の数が最も少ない都市を検索します

      0からn-1までの番号が付けられたn個の都市があるとします。 edge [i] =[fromi、toi、weighti]である配列エッジがある場合、都市fromiとtoiの間の双方向の重み付きエッジを表し、整数の距離しきい値が与えられます。あるパスを介して到達可能で、距離が最大で距離のしきい値である都市の数が最も少ない都市を見つける必要があります。そのような都市が複数ある場合は、最も多い都市を返します。 したがって、入力が-のような場合 nが4で、距離のしきい値も4の場合、出力は3になります。これは- 各都市の距離しきい値=4にある隣接する都市は、- C0 -> [C1, C