在C++中查找三个已排序数组中最接近的三个元素
假设我们有三个已排序的数组A、B和C,以及来自A、B和C的三个元素i、j和k,使得max(|A[i] – B[i]|, |B[j] – C[k]|, |C[k] – A[i]|)最小化。如果A = [1, 4, 10],B = [2, 15, 20],C = [10, 12],则输出元素为10, 15, 10,这三个元素分别来自A、B和C。
假设A、B和C的大小分别为p、q和r。现在按照以下步骤解决这个问题:
- i := 0, j := 0, k := 0
- 现在执行以下操作,直到i < p,j < q,k < r。
- 找到A[i]、B[j]和C[k]的最小值和最大值
- 计算diff := max(X, Y, Z) - min(A[i], B[j], C[k])
- 如果结果小于当前结果,则将其更改为新的结果
- 递增包含最小值的数组的指针。
示例
#include <iostream>
using namespace std;
void getClosestElements(int A[], int B[], int C[], int p, int q, int r) {
int diff = INT_MAX;
int i_final =0, j_final = 0, k_final = 0;
int i=0,j=0,k=0;
while (i < p && j < q && k < r) {
int min_element = min(A[i], min(B[j], C[k]));
int max_element = max(A[i], max(B[j], C[k]));
if (max_element-min_element < diff){
i_final = i, j_final = j, k_final = k;
diff = max_element - min_element;
}
if (diff == 0)
break;
if (A[i] == min_element)
i++;
else if (B[j] == min_element)
j++;
else
k++;
}
cout << A[i_final] << " " << B[j_final] << " " << C[k_final];
}
int main() {
int A[] = {1, 4, 10};
int B[] = {2, 15, 20};
int C[] = {10, 12};
int p = sizeof A / sizeof A[0];
int q = sizeof B / sizeof B[0];
int r = sizeof C / sizeof C[0];
cout << "Closest elements are: ";
getClosestElements(A, B, C, p, q, r);
}输出
Closest elements are: 10 15 10
广告
数据结构
网络
关系数据库管理系统 (RDBMS)
操作系统
Java
iOS
HTML
CSS
Android
Python
C语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP