Arrays 确定数组中是否存在两个元素,其和正好是X?

Arrays 确定数组中是否存在两个元素,其和正好是X?,arrays,algorithm,sorting,hash,hashtable,Arrays,Algorithm,Sorting,Hash,Hashtable,给定一个由N个元素组成的数组A[]和一个数字x,检查A[]中的对,总和为x 方法1=给出O(n lg n)的排序。 方法2=使用给出O(n)的哈希表。 在方法2中,我有一个疑问,如果使用链式连接,那么对于每个元素,我们必须在列表中搜索它的补码,因为链式连接,在最坏的情况下,它会产生O(n^2) 我认为它只有在给定整数的范围时才有效,这样我们就可以得到哈希表,而不需要给出O(n)的链接。我说得对吗?您可以尝试以下方法-> hash all elements in A[], like (key, v

给定一个由N个元素组成的数组A[]和一个数字x,检查A[]中的对,总和为x

方法1=给出O(n lg n)的排序。

方法2=使用给出O(n)的哈希表。

在方法2中,我有一个疑问,如果使用链式连接,那么对于每个元素,我们必须在列表中搜索它的补码,因为链式连接,在最坏的情况下,它会产生O(n^2)


我认为它只有在给定整数的范围时才有效,这样我们就可以得到哈希表,而不需要给出O(n)的链接。我说得对吗?

您可以尝试以下方法->

hash all elements in A[], like (key, value) = (A[i],true) 

for all elements in A[]:
    if hash(x-A[i])=true: it exists

关于哈希表,您是对的,O(n)不是最坏的情况保证的复杂性。 但是,使用合理的哈希函数,最坏的情况应该很少发生

当然,如果在数字范围上给出了一个足够小的上界,你可以使用普通数组来实现这个技巧。

O(N)解决方案,它使用hashmap来保持元素与其频率的关系。保持频率,以便在重复阵列元素的情况下工作

public static boolean countDiffPairsUsingHashing(int[] nums, int target) {

        if (nums != null && nums.length > 0) {
            HashMap<Integer, Integer> numVsFreq = new HashMap<Integer, Integer>();
            for (int i = 0; i < nums.length; i++) {
                numVsFreq.put(nums[i], numVsFreq.getOrDefault(nums[i], 0) + 1);   
            }

            for (int i = 0; i < nums.length; i++) {
                int diff = target - nums[i];
                numVsFreq.put(nums[i], numVsFreq.get(nums[i]) - 1);

                if (numVsFreq.get(diff) != null && numVsFreq.get(diff) > 0) {
                    return true;
                }
                numVsFreq.put(nums[i], numVsFreq.get(nums[i]) + 1);
            }
        }
        return false;
    }
public静态布尔countDiffPairsUsingHashing(int[]nums,int-target){
如果(nums!=null&&nums.length>0){
HashMap numVsFreq=新HashMap();
对于(int i=0;i0){
返回true;
}
numVsFreq.put(nums[i],numVsFreq.get(nums[i])+1;
}
}
返回false;
}

该阵列有多大?您希望多久检查一次?换句话说,在这种特殊情况下,性能有多重要?我现在编辑的可能的副本。我只是想知道,射程是有用的还是在没有射程的情况下有效。