给定N个元素的数组A []和数字x,检查A []中的对是否为x?
方法1 =排序给出O(n lg n)。
方法2 =使用给出O(n)的哈希表。
我对方法2有疑问,如果使用链接,那么对于每个元素我们必须在列表中搜索其补码,在最坏的情况下,由于链接,可以产生O(n ^ 2)。 / p>
我认为只有在给出整数范围时它才会起作用,所以我们可以在没有链接的情况下使用散列表来给出O(n)。我是对的吗?
答案 0 :(得分:0)
您可以尝试以下方法 - >
hash all elements in A[], like (key, value) = (A[i],true)
for all elements in A[]:
if hash(x-A[i])=true: it exists
答案 1 :(得分:0)
你对哈希表是正确的,O(n)不是最糟糕的情况保证的复杂性。 但是,使用合理的散列函数,最坏的情况应该很少发生。
当然,如果在数字范围上给出足够小的上限,你可以使用普通数组来完成这个技巧。
答案 2 :(得分:0)
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;
}