Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 在排序数组中查找一对和为K的整数_Algorithm_Array Algorithms - Fatal编程技术网

Algorithm 在排序数组中查找一对和为K的整数

Algorithm 在排序数组中查找一对和为K的整数,algorithm,array-algorithms,Algorithm,Array Algorithms,给定一个排序的整数数组,我们如何找到一对和为K的整数 e、 g.array=1,3,5,6,10,K=6,答案是1和5 时间复杂度应该最小化。有一个线性(O(n))解决方案 取一个哈希表,在遍历数组时检查当前元素是否已经在哈希表中-如果已经在哈希表中,那么您已经找到了答案。否则,插入等于K减去当前元素的数字。适用于非排序数组,顺便说一句 int[] ar = new int[] { 1, 4, 3, 5 }; int K = 6; HashSet<int> set = new Ha

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

e、 g.
array=1,3,5,6,10
K=6
,答案是1和5

时间复杂度应该最小化。

有一个线性(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);
}
int[]ar=newint[]{1,4,3,5};
int K=6;
HashSet=newhashset();
foreach(ar中的int a)
{
if(集合包含(a))
{
Console.WriteLine(a+“,”+(K-a));
打破
}
增加(K-a);
}

你可能想看看这篇博文:

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

我们的想法是以小于或等于
K/2
的最大数字开始
a
,以大于
a
的最小数字开始
b
。同样,使用二进制搜索查找
a
,并将
b
作为数组中的下一个元素。然后

  • 如果
    a+b=K
    ,则
    返回(a,b)
  • 如果
    a+b
    ,则将
    b
    移动到右侧的一个位置
  • 如果
    a+b>K
    ,则将
    a
    移动到左侧一个位置
当然,您可以跳过二进制搜索,只需在数组开始处启动
a
,在数组结束处启动
b
,然后执行以下操作

  • 如果
    a+b=K
    ,则
    返回(a,b)
  • 如果
    a+b
    ,则将
    a
    移动到右侧的一个位置
  • 如果
    a+b>K
    ,则将
    b
    移动到左侧一个位置
这可能更快。

函数findpairzero(arr){
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]));
设左=0; let right=arr.length-1; while(左<右){ 如果(arr[左]+arr[右]==0){ 返回[arr[左]、arr[右]; }否则如果(arr[左]+arr[右]>0){ 对--; }否则{ 左++; } } } log(findpairzero([-4,-3,-2,-1,0,3,2,4,5]);
听起来很像今天流传的这篇博文:你们大学的学术政策和你们教授的政策允许你们在互联网上要求别人回答你们的家庭作业问题吗?这个问题以前被问过一百万次……甚至在这里。在发布问题之前,请至少做一次谷歌搜索。就解决方案而言..为了减少时间,请使用哈希表。要最小化空间,请对数组进行排序,让两个指针分别指向一端,并根据需要增减它们。您的意思是您有一个已排序的数组。但是示例数组没有排序。是哪一个?