在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

更新于:2020年1月3日

413 次浏览

开启您的职业生涯

完成课程获得认证

开始学习
广告