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

C++プログラムでL番目に小さい数値とR番目に小さい数値の絶対差を返すクエリ


この問題では、サイズnの配列arr []と、それぞれ2つの値LとRで構成されるQクエリが与えられます。私たちのタスクは、クエリを解決してL番目に小さい数とR番目に小さい数。

問題の説明 −各クエリを解決するには、L番目に小さい数とR番目に小さい数のインデックスを見つける必要があります。そして、これらのインデックスの違いを見つけてください。

問題を理解するために例を見てみましょう

入力

arr[] = {8, 4, 1, 5, 2} Q = 2 Queries[][] = {{2, 4}, {1, 5}}

出力

1 2

説明

For {2, 4}: 2nd smallest element is 2 whose index is 4
4th smallest element is 5 whose index is 3 Difference = 4 - 3 = 1
For {1, 5} Smallest element is 1 whose index is 2
5th smallest element is 8 whose index is 0 Difference = 2 - 0 = 2

ソリューションアプローチ

この問題を解決するために、配列要素のインデックスと値を格納するペアを作成します。そして、各クエリのL値とR値の両方についてi番目に小さい要素を見つけます。次に、それらのインデックスの絶対差を出力します。

ソリューションの動作を説明するプログラム

#include <bits/stdc++.h>
using namespace std;
void solveAllQueries(int arr[], int n,int Q, int queries[][2] ) {
   pair<int, int> arrayIndex[n];
   for (int i = 0; i < n; i++) {
      arrayIndex[i].first = arr[i];
      arrayIndex[i].second = i;
   }  
   sort(arrayIndex, arrayIndex + n);
   for (int i = 0; i < Q; i++){
      int result = ( abs(arrayIndex[queries[i][0] - 1].second - arrayIndex[queries[i][1] - 1].second) );
      cout<<"For Query "<<(i+1)<<": Difference is "<<result<<endl;
   }
}
int main() {
   int arr[] = { 8, 4, 1, 5, 2 };
   int n = sizeof(arr) / sizeof(arr[0]);
   int Q = 2; int queries[][2] = { { 2, 4 }, { 1, 5 }};
   solveAllQueries(arr, n, Q, queries);
   return 0;
}

出力

For Query 1: Difference is 1
For Query 2: Difference is 2

このプログラムはペアデータ構造を使用しますが、それを使用せずに違いを見つけることができるソリューションがあります。このために、要素を昇順で格納する配列を使用します。次に、各クエリのLとRの両方の値のi番目に小さい要素を見つけます。次に、それらのインデックスの違いを見つけます。

ソリューションの動作を説明するプログラム

#include <bits/stdc++.h>
using namespace std;
int searchEle(int arr[], int ele, int n){
    for(int i = 0; i < n; i++)
   if(arr[i] == ele)
      return i;
      return -1;
}
int findDifference(int arr[], int minArray[], int n, int L, int R){
   int Lele = minArray[L-1];
   int Rele = minArray[R-1];
   int index1 = searchEle(arr, Lele, n);
   int index2 = searchEle(arr, Rele, n);
   return abs(index1 - index2);
 }
void solveAllQueries(int arr[], int n,int Q, int queries[][2] ) {
   int minArray[n];
   for (int i = 0; i < n; i++)
   minArray[i] = arr[i];
   sort(minArray, minArray + n);
   for(int i = 0; i < Q; i++){
      cout<<"For Query "<<(i+1)<<": Difference is "<<findDifference(arr, minArray, n,       queries[i][0], queries[i][1])<<endl;
   }
}
int main() {
   int arr[] = { 8, 4, 1, 5, 2 };
   int n = sizeof(arr) / sizeof(arr[0]);
   int Q = 2; int queries[][2] = { { 2, 4 }, { 1, 5 }};
   solveAllQueries(arr, n, Q, queries); return 0;
}

出力

For Query 1: Difference is 1
For Query 2: Difference is 2

  1. 2つの整数を受け入れ、余りを返すC#プログラム

    まず、2つの数字を設定します。 int one = 250; int two = 200; 次に、これらの数値を次の関数に渡します。 public int RemainderFunc(int val1, int val2) {    if (val2 == 0)    throw new Exception("Second number cannot be zero! Cannot divide by zero!");    if (val1 < val2)    throw new E

  2. Javaの配列の最大素数と最小素数の違い

    問題の説明 すべての要素が1000000未満である整数の特定の配列を使用します。配列内の最大の素数と最小の素数の差を見つけます。 例 Array: [ 1, 2, 3, 4, 5 ] Largest Prime Number = 5 Smallest Prime Number = 2 Difference = 5 - 3 = 2. 解決策 エラトステネスのふるいアプローチを使用します。これは、特定の数よりも小さいすべての素数を見つけるための効率的な方法です。次に、必要な差を得るために最大と最小の素数を計算します。 例 以下は、必要な出力を見つけるためのJavaのプログラムです。 pu