在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

更新於:2019年12月19日

306 次瀏覽

啟動你的職業生涯

完成課程獲得認證

開始學習
廣告