【问题标题】:Determine whether or not there exist two elements in an array whose sum is exactly X?确定数组中是否存在两个元素之和正好为 X?
【发布时间】:2016-08-31 07:02:48
【问题描述】:

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

方法 1 = 排序,得到 O(n lg n)。

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

我对方法 2 有疑问,如果使用链接会怎样,那么对于每个元素,我们必须在列表中搜索其补码,在最坏的情况下,由于链接,这可能会产生 O(n^2)。

我认为它只有在给定整数范围时才会起作用,这样我们就可以在没有给出 O(n) 的链接的情况下拥有哈希表。我说的对吗?

【问题讨论】:

标签: arrays algorithm sorting hash hashtable


【解决方案1】:

你可以试试下面的方法->

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

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

【讨论】:

    【解决方案2】:

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

    当然,如果数字范围的上限足够小,您可以使用普通数组来解决问题。

    【讨论】:

      【解决方案3】:

      O(N) 解决方案,它使用 hashmap 来维护元素 Vs 其频率。保持频率以使其适用于重复数组元素的情况。

      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;
          }
      

      【讨论】:

        猜你喜欢
        • 2011-01-11
        • 2015-05-27
        • 1970-01-01
        • 1970-01-01
        • 2017-03-09
        • 2012-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多