📌  相关文章
📜  Java程序找到一个三元组,使得两个之和等于第三个元素

📅  最后修改于: 2022-05-13 01:55:25.227000             🧑  作者: Mango

Java程序找到一个三元组,使得两个之和等于第三个元素

给定一个整数数组,你必须找到三个数字,使得两个元素的和等于第三个元素。
例子:

Input: {5, 32, 1, 7, 10, 50, 19, 21, 2}
Output: 21, 2, 19

Input: {5, 32, 1, 7, 10, 50, 19, 21, 0}
Output: no such triplet exist

问题来源:Arcesium 面试经历 | Set 7 (校内实习)

简单的方法:运行三个循环并检查是否存在一个三元组,使得两个元素的和等于第三个元素。
时间复杂度:O(n^3)
高效方法:这个想法类似于 Find a triplet that sum to a given value。

  • 首先对给定的数组进行排序。
  • 从后面开始固定三个中最大的元素并遍历数组以找到其他两个数字,它们的总和为第三个元素。
  • 取两个指针 j(从前面)和 k(最初是 i-1)找到两个数字中的最小者,并从 i-1 找到剩余两个数字中的最大者
  • 如果两个数之和仍然小于A[i],那么我们需要增加两个数之和的值,从而增加j指针,从而增加A[j] + A[ ķ]
  • 如果两个数之和大于A[i],则需要减小两个数之和的值,从而减小k指针,从而减小A[j] + A[k的总和] .

下图是上述方法的试运行:

下面是上述方法的实现:

Java
// Java program to find three numbers
// such that sum of two makes the
// third element in array
import java.util.Arrays;
  
public class GFG 
{
    // Utility function for finding
    // triplet in array
    static void findTriplet(int arr[], int n)
    {
        // Sort the array
        Arrays.sort(arr);
  
        // For every element in arr check 
        // if a pair exist(in array) whose
        // sum is equal to arr element
        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]) 
                {
                    // Pair found
                    System.out.println("numbers are " + arr[i] + 
                                       " " + arr[j] + " " + arr[k]);
                    return;
                }
                else if (arr[i] > arr[j] + arr[k])
                    j += 1;
                else
                    k -= 1;
            }
        }
  
        // No such triplet is found in array
        System.out.println("No such triplet exists");
    }
  
    // Driver code
    public static void main(String args[])
    {
        int arr[] = {5, 32, 1, 7, 10, 
                     50, 19, 21, 2};
        int n = arr.length;
        findTriplet(arr, n);
    }
}
// This code is contributed by Sumit Ghosh


输出:

numbers are 21 2 19

时间复杂度:O(N^2)
有关更多详细信息,请参阅有关查找三元组的完整文章,以使两个之和等于第三个元素!