Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ค้นหาแฝดที่ผลรวมของสองเท่ากับองค์ประกอบที่สามใน C++


สมมติว่ามีอาร์เรย์ของตัวเลข 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