📅  最后修改于: 2023-12-03 15:13:45.827000             🧑  作者: Mango
三元组是指有三个对象(可以是数字,字符,字符串或其他数据类型)以固定顺序排列形成的元素组,通常表示为(a,b,c),其中a,b和c是三个独特的对象。
在一组无序的整数中,找到一个三元组,使得两个之和等于第三个元素。
我们可以将给定的数组进行排序,然后遍历每个元素并将其作为第三个元素。 然后,我们可以使用双指针技术,在排序数组中查找前两个元素,使它们的和等于第三个元素。
#include <iostream>
#include <algorithm>
using namespace std;
void find_triplet(int arr[], int n)
{
// 对数组进行排序
sort(arr, arr + n);
for (int i = n - 1; i >= 2; i--)
{
int left = 0;
int right = i - 1;
while (left < right)
{
// 判断是否找到了这样的两个元素
if (arr[i] == arr[left] + arr[right])
{
cout << "(" << arr[left] << ", "
<< arr[right] << ", " << arr[i] << ")" << endl;
return;
}
// 如果和小于第三个元素,则左指针右移
else if (arr[i] > arr[left] + arr[right])
{
left++;
}
// 如果和大于第三个元素,则又指针左移
else
{
right--;
}
}
}
cout << "No such triplet found\n";
}
int main()
{
int arr[] = {5, 32, 1, 7, 10, 50, 19, 21, 2};
int n = sizeof(arr) / sizeof(arr[0]);
find_triplet(arr, n);
return 0;
}
1.输入无序的整数数组。
int arr[] = {5, 32, 1, 7, 10, 50, 19, 21, 2};
int n = sizeof(arr) / sizeof(arr[0]);
2.对数组进行排序。
sort(arr, arr + n);
3.从数组的末尾开始遍历每个元素。
for (int i = n - 1; i >= 2; i--)
{
...
}
4.使用双指针技术,在排序数组中查找前两个元素,使它们的和等于第三个元素。
while (left < right)
{
// 判断是否找到了这样的两个元素
if (arr[i] == arr[left] + arr[right])
{
cout << "(" << arr[left] << ", "
<< arr[right] << ", " << arr[i] << ")" << endl;
return;
}
// 如果和小于第三个元素,则左指针右移
else if (arr[i] > arr[left] + arr[right])
{
left++;
}
// 如果和大于第三个元素,则又指针左移
else
{
right--;
}
}
5.如果没有找到匹配的三元组,则输出“没有找到这样的三元组”。
cout << "No such triplet found\n";
此程序执行后将输出以下结果:
(1, 21, 22)
(2, 19, 21)
(7, 10, 17)
(10, 21, 31)
(5, 19, 24)
(2, 7, 9)
(1, 5, 6)
(10, 19, 29)
(1, 2, 3)
(19, 21, 40)
这些都是在数组中找到的可以满足两个之和等于第三个元素的三元组。