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

C++の配列内のすべての要素ペア間のk番目に小さい差を見つけるプログラム


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

したがって、入力が数値={2、6、4、8}、k =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増やします
  • 配列入力を並べ替える
  • le:=0
  • ri:=入力の最後の要素-入力の最初の項目
  • le を実行します
  • mid:=(le + ri)/ 2
  • tmp:=0
  • lp:=0
  • iを初期化する場合:=1、i <入力のサイズの場合、更新(iを1増やします)、実行-
    • input [i] --input [lp]> midの間、-
        を実行します
      • lp:=lp + 1
    • tmp:=tmp + i --lp
  • tmp> =kの場合、-
    • ri:=mid
  • それ以外の場合
    • le:=mid + 1
  • return le
  • 理解を深めるために、次の実装を見てみましょう-

    #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

    1. 配列から最小の要素を見つけるためのC#プログラム

      配列を宣言する- int[] arr = { 5, 9, 2, 7 }; ここで、配列から最小の要素を取得するには、Min()メソッド-を使用します。 arr.Min()); これが完全なコードです- 例 using System; using System.Linq; class Demo {    static void Main() {       int[] arr = { 5, 9, 2, 7 };       Console.WriteLine(arr.Min());    }

    2. 2D配列でK番目に小さい要素を見つけるC#プログラム

      2D配列を宣言する- int[] a = new int[] {    65,    45,    32,    97,    23,    75,    59 }; K番目に小さい整数、つまり5番目に小さい整数が必要だとします。配列を最初に並べ替える- Array.Sort(a); 5番目に小さい要素を取得するには- a[k - 1]; 完全なコードを見てみましょう- 例 using System; using System.IO; using S