当前位置: 首页 > 面试题库 >

从一个数组中找出总和等于给定数字的所有元素对

司马弘益
2023-03-14
问题内容

给定一个数组,我们需要找到总和等于数字 X 的所有对。
例如:

array[]={ -40, -5, 1, 3, 6, 7, 8, 20 };
Pair of elements whose sum is equal to 15 :  7, 8 and -5, 20

问题答案:

解决方案1:
您可以检查每一对数字,并找到总和等于 X。
Java 代码:

public static void findPairsWithSumEqualsToXBruteForce(int arr[], int X) {
    if (arr.length < 2)
        return;

    System.out.println("The pair whose sum is equal to 15 using brute force method: ");
    for (int i = 0; i < arr.length; i++) {
        for (int j = i + 1; j < arr.length; j++) {
            int tempSum = arr[i] + arr[j];

            if (tempSum == X) {
                System.out.println(arr[i] + " " + arr[j]);
            }
        }
    }
}

解决方案2:
对数组进行排序 * 我们将维护两个索引,一个在开头(l=0),一个在结尾(r=n-1) * 迭代直到 l < r * 检查 arr[l] + arr[r] 是否等于 X * 如果是,则打印该对并执行 l , r– * 如果 arr[l] + arr[r] 小于 X,这意味着如果我们想找到接近 X 的和,做 r– * 如果 arr[l] + arr[r] 大于 X,这意味着如果我们想找到接近 X 的总和,请执行 l

java代码:

public static void findPairsEqualsToX(int arr[], int X) {

    int n = arr.length;
    if (n < 2)
        return;
    Arrays.sort(arr);
    System.out.println("The pair whose sum is equal to 15 : ");
    // left and right index variables
    int l = 0, r = n - 1;

    while (l < r) {
        int currentSum = arr[l] + arr[r];
        if (currentSum == X) {
            System.out.println(arr[l] + " " + arr[r]);
            l++;
            r--;
        } else if (arr[l] + arr[r] < X)
            l++;
        else
            r--;
    }
}

时间复杂度:O(NLogN)

解决方案3:
使用哈希

  • 将数组元素放入HashMap,元素为键,索引为值。
  • 遍历数组 arr[]
  • 检查 arr[i],如果 X-arr[i] 存在于 HashMap 中。
  • 如果是,我们已经找到了这对并打印出来。
    java代码:
public static void findPairsEqualsToXUsingHashing(int arr[], int X) {
    HashMap<Integer, Integer> elementIndexMap = new HashMap<Integer, Integer>();
    System.out.println("The pair whose sum is equal to 15 : ");
    for (int i = 0; i < arr.length; i++) {
        elementIndexMap.put(arr[i], i);
    }
    for (int i = 0; i < arr.length; i++) {
        // we have used elementIndexMap.get(X-arr[i])!=i to avoid using same
        // element twice
        if (elementIndexMap.get(X - arr[i]) != null && elementIndexMap.get(X - arr[i]) != i) //
        {
            System.out.println(arr[i] + " " + (X - arr[i]));
        }
    }
}

时间复杂度:O(NLogN) 空间复杂度:O(N)
查找总和等于给定数字的所有对的 Java 程序:

package org.arpit.java2blog;

import java.util.Arrays;
import java.util.HashMap;

public class FindPairEqualToGivenNumberMain {

    public static void main(String[] args) {
        int array[] = { -40, -5, 1, 3, 6, 7, 8, 20 };
        findPairsWithSumEqualsToXBruteForce(array, 15);
        findPairsEqualsToX(array, 15);
        findPairsEqualsToXUsingHashing(array, 15);
    }

    public static void findPairsWithSumEqualsToXBruteForce(int arr[], int X) {
        if (arr.length < 2)
            return;

        System.out.println("The pair whose sum is closest to 15 using brute force method: ");
        for (int i = 0; i < arr.length; i++) {
            for (int j = i + 1; j < arr.length; j++) {
                int tempSum = arr[i] + arr[j];

                if (tempSum == X) {
                    System.out.println(arr[i] + " " + arr[j]);
                }
            }
        }
    }

    public static void findPairsEqualsToX(int arr[], int X) {

        int n = arr.length;
        if (n < 2)
            return;
        Arrays.sort(arr);
        System.out.println("The pair whose sum is closest to 15 : ");
        // left and right index variables
        int l = 0, r = n - 1;

        while (l < r) {
            int currentSum = arr[l] + arr[r];
            if (currentSum == X) {
                System.out.println(arr[l] + " " + arr[r]);
                l++;
                r--;
            } else if (arr[l] + arr[r] < X)
                l++;
            else
                r--;
        }
    }

    public static void findPairsEqualsToXUsingHashing(int arr[], int X) {
        HashMap<Integer, Integer> elementIndexMap = new HashMap<Integer, Integer>();
        System.out.println("The pair whose sum is closest to 15 : ");
        for (int i = 0; i < arr.length; i++) {
            elementIndexMap.put(arr[i], i);
        }
        for (int i = 0; i < arr.length; i++) {
            // we have used elementIndexMap.get(X-arr[i])!=i to avoid using same
            // element twice
            if (elementIndexMap.get(X - arr[i]) != null && elementIndexMap.get(X - arr[i]) != i) //
            {
                System.out.println(arr[i] + " " + (X - arr[i]));
            }
        }
    }
}

当你运行上面的程序时,你会得到以下输出:

  The pair whose sum is closest to 15 using brute force method: 
-5 20
7 8
The pair whose sum is closest to 15 : 
-5 20
7 8
The pair whose sum is closest to 15 : 
-5 20
7 8
8 7
20 -5


 类似资料:
  • 我在一次采访中被问到以下问题。虽然我用n元树回答了这个问题,但有人告诉我这还不够好。所以,我很好奇,什么是它的最佳解决方案。 输入:整数数组:[2,3,7]和总和:10 输出:加起来等于和的所有数组元素组合(例如2、2、3、3、7等) 谢了小泰

  • 本文向大家介绍从三个链表中查找一个三元组,其总和等于C ++中的给定数字,包括了从三个链表中查找一个三元组,其总和等于C ++中的给定数字的使用技巧和注意事项,需要的朋友参考一下 在本教程中,我们将编写一个程序,该程序在链表中查找三元组,其总和等于给定的数字。 让我们看看解决问题的步骤。 为链表创建一个struct节点。 用伪数据创建链接列表。 为三个元素编写三个内部循环,这些循环将迭代直到链接列

  • 在Javascript中,还有其他有效的方法来实现此任务吗? 我尝试的身份是: 这里输出:

  • 本文向大家介绍写一个算法找到数组中两个元素相加等于指定数的所有组合相关面试题,主要包含被问及写一个算法找到数组中两个元素相加等于指定数的所有组合时的应答技巧和注意事项,需要的朋友参考一下

  • 本文向大家介绍写一个方法找出指定一维数组所有不重复的元素和个数相关面试题,主要包含被问及写一个方法找出指定一维数组所有不重复的元素和个数时的应答技巧和注意事项,需要的朋友参考一下 const setArray = arr => { return arr.filter(v => arr.indexOf(v) === arr.lastIndexOf(v)); };

  • 给定一组未排序的整数,返回大小为k的所有子集(即每组有k个唯一元素),其总和为0。 所以我给了面试官以下解决方案(我在GeekViewpoint上研究过)。没有使用额外的空间,一切都做到位,等等。但当然成本是O(n^k)的高时间复杂度,其中在解决方案中。 但随后她提出了以下要求: 必须在答案中使用hashmap以降低时间复杂度 必须绝对地为一般情况提供时间复杂度 k=6时的提示,O(n^3) 她对