สมมติว่าเรามีอาร์เรย์ที่เรียงลำดับสาม A, B และ C และสามองค์ประกอบ i, j และ k จาก A, B และ C ตามลำดับซึ่ง 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
- ค้นหาค่าต่ำสุดและสูงสุดของ A[i], B[j] และ C[k]
- คำนวณส่วนต่าง :=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