C ++程序查找所有零和的三元组
给定一组不同的元素。任务是在数组中找到总和为零的三元组。
例子 :
Input : arr[] = {0, -1, 2, -3, 1}
Output : (0 -1 1), (2 -3 1)
Explanation : The triplets with zero sum are
0 + -1 + 1 = 0 and 2 + -3 + 1 = 0
Input : arr[] = {1, -2, 1, 0, 5}
Output : 1 -2 1
Explanation : The triplets with zero sum is
1 + -2 + 1 = 0
方法 1:这是一个简单的方法,需要 O(n 3 ) 时间才能得出结果。
- 方法:天真的方法运行三个循环,并一一检查三个元素的总和是否为零。如果三个元素的总和为零,则打印元素,否则打印未找到。
- 算法:
- 使用循环计数器i 、 j 、 k运行三个嵌套循环
- 第一个循环将从 0 运行到 n-3,第二个循环从 i+1 运行到 n-2,第三个循环从 j+1 运行到 n-1。循环计数器代表三元组的三个元素。
- 检查第 i'th, j'th, k'th 处的元素之和是否等于 0。如果是,则打印总和,否则继续。
下面是上述方法的实现:
C++
// A simple C++ program to find three elements// whose sum is equal to zero#includeusing namespace std;// Prints all triplets in arr[] with 0 sumvoid findTriplets(int arr[], int n){bool found = false;for (int i=0; iOutput0 -1 1
2 -3 1
C++
// C++ 程序查找给定的三元组
// 总和为零的数组
#包括
使用命名空间标准;
// 打印总和为 0 的三元组的函数
无效 findTriplet(int arr[], int n)
{
布尔发现=假;
对于 (int i=0; 我
对于 (int j=i+1; j -1 0 1
-3 2 1
复杂性分析:
- 时间复杂度: O(n 2 )。
由于需要两个嵌套循环,因此时间复杂度为 O(n 2 )。 - 辅助空间: O(n)。
由于需要hashmap,所以空间复杂度是线性的。
方法3:该方法使用Sorting得到正确的结果,并在O(n 2 )时间内求解。
方法:上述方法需要额外的空间。这个想法是基于这篇文章的方法2。对于每个元素,检查是否有一对总和等于该元素的负值。
算法:
- 按升序对数组进行排序。
- 从头到尾遍历数组。
- 对于每个索引i ,创建两个变量l = i + 1和r = n – 1
- 如果 array[i]、array[l] 和 array[r] 之和为零,则运行循环直到 l 小于 r,然后打印三元组并中断循环
- 如果总和小于零,则增加 l 的值,通过增加 l 的值,总和将随着数组排序而增加,因此array[l+1] > array [l]
- 如果总和大于零,则减少 r 的值,通过增加 l 的值,总和将随着数组的排序而减少,因此array[r-1] < array [r] 。
下面是上述方法的实现:
C++
// C++ 程序查找给定的三元组
// 总和为零的数组
#包括
使用命名空间标准;
// 打印总和为 0 的三元组的函数
无效 findTriplet(int arr[], int n)
{
布尔发现=假;
// 对数组元素进行排序
排序(arr,arr+n);
对于 (int i=0; 我-3 1 2
-1 0 1
复杂性分析:
- 时间复杂度: O(n 2 )。
只需要两个嵌套循环,因此时间复杂度为 O(n 2 )。 - 辅助空间: O(1),不需要额外的空间,所以时间复杂度是恒定的。
有关详细信息,请参阅有关查找所有零和三元组的完整文章!