【问题标题】:finding a pair of integers in a sorted array which sum to K在有序数组中找到一对整数,总和为 K
【发布时间】:2011-10-07 00:33:53
【问题描述】:

给定一个排序好的整数数组,我们如何找到一对和为 K 的整数?

例如array = 1,3,5,6,10K = 6,答案是1和5。

时间复杂度应该最小化。

【问题讨论】:

  • 听起来很像今天广为流传的这篇博文:codingatwork.com/2011/07/array-sum
  • 贵校的学术政策和教授的政策是否允许您在互联网上请人回答您的作业问题?
  • 这个问题之前已经被问过一百万次了……甚至在这里。请至少在发布问题之前进行谷歌搜索。就解决方案而言..为了最大限度地减少使用哈希表的时间。为了最小化空间..对数组进行排序,有两个指针,每个指针都指向一端,并根据需要递增和递减它们。
  • 你说你有一个排序数组。但是示例数组未排序。是哪个?

标签: algorithm array-algorithms


【解决方案1】:

你可能想看看这篇博文:

http://www.codingatwork.com/2011/07/array-sum/

我的方法是对列表进行二分搜索以查找K/2,然后向左移动一个变量a 并向右移动另一个变量b 试图找到解决方案a+b=K

我们的想法是从小于或等于K/2 的最大数字开始a,从大于a 的最小数字开始b。同样,使用二分搜索查找 a 并让 b 成为数组中的下一个元素。那么

  • 如果a+b = K,那么return (a,b)
  • 如果是a+b < K,则将b向右移动一位。
  • 如果是a+b > K,则将a向左移动一位。

当然,你也可以跳过二分查找,只在数组的开头开始a,在数组的末尾开始b,然后做

  • 如果a+b = K,那么return (a,b)
  • 如果是a+b < K,则将a向右移动一位。
  • 如果是a+b > K,则将b向左移动一位。

这可能更快。

【讨论】:

    【解决方案2】:

    存在线性 (O(n)) 解。

    获取一个哈希表并在遍历数组时检查当前元素是否已经在哈希表中 - 如果是,那么您已经找到了答案。否则插入等于 K 减去当前元素的数字。适用于非排序数组,顺便说一句。

    int[] ar = new int[] { 1, 4, 3, 5 };
    int K = 6;
    
    HashSet<int> set = new HashSet<int>();
    foreach (int a in ar)
    {
        if (set.Contains(a))
        {
            Console.WriteLine(a + ", " + (K - a));
            break;
        }
    
        set.Add(K - a);
    }
    

    【讨论】:

      【解决方案3】:
      function findpairzero(arr) {
       let left = 0;
       let right = arr.length - 1;
      
       while (left < right) {
       if (arr[left] + arr[right] === 0) {
        return [arr[left], arr[right]];
        } else if (arr[left] + arr[right] > 0) {
        right--;
        } else {
        left++;
       }
      }
      }
      
      console.log(findpairzero([-4, -3, -2, -1, 0, 3, 2, 4, 5]));
      

      【讨论】:

        猜你喜欢
        • 2017-07-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-04
        • 2020-02-22
        • 2011-08-03
        相关资源
        最近更新 更多