Java 数组中的偶和

Java 数组中的偶和,java,algorithm,Java,Algorithm,我有一个整数数组,上面写着:[17,1,20,4,12,9]我想得到所有和为21的夫妇。 例如,在给定的数组中,输出应如下所示: 17,4 1,20 12,9 我可以使用两个循环来实现同样的效果。但复杂性是N^2。有什么有效的方法可以做到这一点。使用哈希集 例如,将所有元素放在一个哈希集中(单循环,O(N)) 然后再次迭代元素,对于每个元素i,检查HashSet是否包含21-i。这也需要O(N) 您可以在单个循环中进一步优化和执行这两个步骤,但这不会改变渐近O(N)运行时间 Set<In

我有一个整数数组,上面写着:
[17,1,20,4,12,9]
我想得到所有和为21的夫妇。 例如,在给定的数组中,输出应如下所示:

17,4
1,20
12,9

我可以使用两个循环来实现同样的效果。但复杂性是N^2。有什么有效的方法可以做到这一点。

使用
哈希集

例如,将所有元素放在一个
哈希集中(单循环,O(N))

然后再次迭代元素,对于每个元素
i
,检查
HashSet
是否包含
21-i
。这也需要O(N)

您可以在单个循环中进一步优化和执行这两个步骤,但这不会改变渐近O(N)运行时间

Set<Integer> set = new HashSet<>();
for (int i=0;i<arr.length;i++) {
    if (set.contains(21 - arr[i])) {
        System.out.println(arr[i] + ", " + (21 - arr[i]));
    }
    set.add (arr[i]);
}
Set Set=newhashset();

对于(int i=0;i,这里有一段工作代码和您的示例,使用
HashSet

import java.util.*;

public class Main{
    public static void main(String[] args) {
        int[] arr = new int[]{17, 1, 20, 4, 12, 9};
        HashSet<Integer> hash = new HashSet<Integer>(); 
        int sum = 21;
        
        for(int i = 0; i < arr.length; i++){
            hash.add(arr[i]);
        }
        
        for(int i = 0; i < arr.length; i++){
            if(hash.contains(sum - arr[i])){
                System.out.println(arr[i] + " and " + (sum - arr[i]));
                hash.remove(arr[i]);
            }
        }
    }
}
import java.util.*;
公共班机{
公共静态void main(字符串[]args){
int[]arr=新的int[]{17,1,20,4,12,9};
HashSet hash=新HashSet();
整数和=21;
对于(int i=0;i
复杂度为O(n)。方法是将数组的所有数字添加到哈希集中。然后,迭代数组,检查每个元素
arr[i]
sum-arr[i]
位于哈希集中。如果是,则表示您有一个匹配对,因此您可以删除该对中的一个元素以避免重复匹配。

下面是一个使用python 3.0+的解决方案。 您可以在O(N)中使用密钥对值数据结构(即字典)来完成此操作

方法:

  • 在数组中循环一次,检查从当前元素即(k-arr[i])中减去的值k的结果是否存在于字典中,这意味着结果值k-arr[i]和当前元素arr[i]的总和等于k。将这两个值相加到字典中

  • 如果字典中不存在k-arr[i],则添加值为k-arr[i]的键arr[i]

  • 您还可以添加当前元素arr[i]大于k的检查

     def getPair(arr, k, dict):
         for i in range(len(arr)):
             if k - arr[i] in dict.keys():
                 pass
                 #print(arr[i], " ", (k-arr[i]))
             else:
                 if k > arr[i]:
                     dict[arr[i]] = (k-arr[i])
    
     arr = [17, 1, 20, 4, 12, 9, 23]
     dict = {}
     getPair(arr, 21, dict)
     print("result: " , dict)
    

  • 您可以使用哈希集在O(n)或使用集合在O(n lg(n))中执行此操作。您能给出一点逻辑吗?此问题的一般化版本已在为您的案例添加工作解决方案时得到回答。但是哈希集包含方法本身,每种方法都具有O(n)复杂度element@Shadow否,
    HashSet
    contains()
    预期为O(1)复杂性。不,它是O(1)。谢谢你的回答,但这会打印两次数字,对吗?@Shadow No。当你遇到一对中的第一个数字时,第二个数字还不在集合中,所以直到你遇到第二个数字时,这对数字才被打印出来。