C++程序中返回第 L 小数和第 R 小数的绝对差的查询


在这个问题中,我们给定一个大小为 n 的数组 arr[] 和 Q 个查询,每个查询包含 2 个值 L 和 R。我们的任务是创建一个程序来解决查询,以返回第 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

此程序使用 pair 数据结构,但有一种解决方案可以在不使用它的情况下找到差异。为此,我们将使用一个数组,该数组将按升序存储元素。然后为每个查询的 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

更新于: 2020-12-22

77 次查看

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告

© . All rights reserved.