📅  最后修改于: 2023-12-03 15:23:03.302000             🧑  作者: Mango
这是2013年德里政府工程学院在印度宇航局举办的编程比赛中的一道问题。该问题在计算机科学和编程中非常普遍。问题为,给出一个整数数组和一个数字n,找出数组中的所有三元组,这些三元组的和等于给定数字n。
以下是这个问题的c++解决方案:
#include <bits/stdc++.h>
using namespace std;
void findTriplets(int arr[], int n, int sum)
{
sort(arr, arr + n);
for (int i = 0; i < n - 2; i++)
{
int l = i + 1, r = n - 1;
while (l < r)
{
if (arr[i] + arr[l] + arr[r] == sum)
{
printf("%d %d %d\n", arr[i], arr[l], arr[r]);
l++;
r--;
}
else if (arr[i] + arr[l] + arr[r] < sum)
l++;
else
r--;
}
}
}
int main()
{
int arr[] = {0, -1, 2, -3, 1};
int sum = -2;
int n = sizeof(arr) / sizeof(arr[0]);
findTriplets(arr, n, sum);
return 0;
}
这个程序使用了数组排序和两个指针。排序使得我们可以方便地比较元素,而指针可以帮助我们在O (n²)时间内查找三元组。通过对数组中的元素进行遍历,我们将l设置为i +1,r设置为n -1并启动while循环。 当l<r时,我们比较数组[i] + arr[l] + arr[r]和目标值的大小。 如果它等于目标值,我们打印出它们的值,并更新指针。 如果小于目标值,我们将l + 1,否则将r -1。
这个问题的时间复杂度为O(n²)和空间复杂度为O(1)。