ホームページ  >  記事  >  バックエンド開発  >  C++ でプログラムを作成し、配列内の要素のすべてのペアの間で k 番目に小さい差を見つけます。

C++ でプログラムを作成し、配列内の要素のすべてのペアの間で k 番目に小さい差を見つけます。

WBOY
WBOY転載
2023-09-05 17:25:06758ブラウズ

C++ でプログラムを作成し、配列内の要素のすべてのペアの間で k 番目に小さい差を見つけます。

複数の整数を含むリストがあるとします。配列内の各値のペア間の差を見つけて、k 番目に小さい差の数を見つける必要があります。インデックスは 0 から始まり、値 k が入力として与えられます。

したがって、入力が数値 = {2, 6, 4, 8}、k = 2 のような場合、出力は 2 になります。

2 つのペアの差は -

(2, 6) = 4

(2, 4) = 2

(2, 8) です。 ) = 6

(6, 4) = 2

(6, 8) = 2

(4, 8) = 4

次の場合値を並べ替えると、2、2、2、4、4、6となります。 2 番目の最小値は 2 です。 (からインデックス付け 0)。

この問題を解決するには、次の手順に従います。

  • k を 1 ずつ増やします。
  • 配列 input
  • le: = をソートします。 0
  • ri := 入力の最後の要素 - 入力の最初の項目
  • while le
  • mid := (le ri) / 2
  • tmp := 0
  • lp := 0
  • は i := 1 の初期化に使用され、i を実行します。
  • input[i] - input[lp] > 途中で、-
    • lp := lp 1
  • tmp := tmp i - lp## を実行します。
#If tmp >= k, then -
    • ri := Mid
    ##otherwise
  • le := Mid 1
  • Return le
  • Example

    理解を深めるために、次の実装を見てみましょう -

    #include<bits/stdc++.h>
    
    using namespace std;
    
    int solve(vector<int>& input, int k) {
    k++;
    sort(input.begin(), input.end());
    int le = 0;
    int ri = input.back() - input[0];
    while (le < ri) {
    int mid = (le + ri) / 2;
    long long tmp = 0;
    int lp = 0;
    for (int i = 1; i < input.size(); i++) {
    while (input[i] - input[lp] > mid) lp++;
    tmp += i - lp;
    }
    if (tmp >= k)
    ri = mid;
    else
    le = mid + 1;
    }
    return le;
    }
    int main() {
    vector<int> numbers = {2, 6, 4, 8};
    cout<< solve(numbers, 2) <<endl;
    return 0;
    }

    入力

    vector<int> numbers = {2, 6, 4, 8};
    cout<< solve(numbers, 2) <<endl;

    出力

    2

    以上がC++ でプログラムを作成し、配列内の要素のすべてのペアの間で k 番目に小さい差を見つけます。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

  • 声明:
    この記事はtutorialspoint.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。