📌  相关文章
📜  国际空间研究组织 | ISRO CS 2013 |问题 71(1)

📅  最后修改于: 2023-12-03 15:23:03.302000             🧑  作者: Mango

国际空间研究组织 | ISRO CS 2013 |问题 71

这是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)。