สมมติว่ามีอาร์เรย์ของตัวเลข n เราต้องหาตัวเลขสามตัว ดังนั้นผลรวมของสององค์ประกอบจะเท่ากับตัวที่สาม ดังนั้นหากอาร์เรย์เป็นแบบ [5, 32, 1, 7, 10, 50, 19, 21, 2] ผลลัพธ์จะเป็น 21, 2, 19 หากไม่พบองค์ประกอบดังกล่าว ให้แสดงข้อความนั้น
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนดังต่อไปนี้ −
-
จัดเรียงอาร์เรย์ที่กำหนด
-
จากนั้นเริ่มแก้ไของค์ประกอบที่ยิ่งใหญ่ที่สุดจากองค์ประกอบสุดท้ายและสำรวจอาร์เรย์เพื่อค้นหาตัวเลขอีกสองตัวที่รวมกันเป็นองค์ประกอบที่สาม
-
ใช้ตัวชี้สองตัว j และ k, j มาจากตัวแรก, k มาจากตัวสุดท้ายเพื่อหาค่าที่น้อยที่สุดของสองตัวเลขจาก i - 1 เพื่อหาจำนวนที่ใหญ่ที่สุดของตัวเลขที่เหลือทั้งสองตัว
-
หากการบวกของตัวเลขทั้งสองยังน้อยกว่า Arr[i] เราก็จะต้องเพิ่มค่าของการรวมของตัวเลขสองตัวจึงเพิ่มตัวชี้ j เพื่อเพิ่มมูลค่าของ Arr[j] + Arr[ k]
-
หากการบวกของตัวเลขทั้งสองมากกว่า Arr[i] เราต้องลดค่าของการรวมของตัวเลขสองตัวลง ซึ่งจะทำให้ตัวชี้ k ลดลง ซึ่งจะลดค่าโดยรวมของ Arr[j] + Arr[k ]
ตัวอย่าง
#include<iostream>
#include<algorithm>
#define N 5
using namespace std;
void getValueTriplet(int arr[], int n) {
sort(arr, arr + n);
for (int i = n - 1; i >= 0; i--) {
int j = 0;
int k = i - 1;
while (j < k) {
if (arr[i] == arr[j] + arr[k]) {
cout << "The numbers are " << arr[i] << " " << arr[j] << " " << arr[k] << endl;
return;
}
else if (arr[i] > arr[j] + arr[k])
j += 1;
else
k -= 1;
}
}
cout << "No such triplet exists";
}
int main() {
int arr[] = { 5, 32, 1, 7, 10, 50, 19, 21, 2 };
int n = sizeof(arr) / sizeof(arr[0]);
getValueTriplet(arr, n);
} ผลลัพธ์
The numbers are 21 2 19