当前位置: 首页 > 知识库问答 >
问题:

算法-给定一个由n个整数和另一个整数x组成的集合S,确定S中是否存在两个和正好为x的元素

孔城
2023-03-14

描述一个算法,其中给定一组由n个整数和另一个整数x组成的S,确定S中是否存在两个元素,其和正好是x。请告诉我我的算法是否正确,或者我需要做什么修改?算法:

Algo(i,j,k,S)
    for (j = 1 to S.length - 1 , i++ )
       for (i= j+1 to S.length)
        A[k] = A[j] + A[i]
        if A[k] = x
          return A[i], A[j]
        else j++

共有3个答案

蒋鹏鹍
2023-03-14

我想你需要一些标准:

1) 在任何一行之前添加一个数字,以便将来方便地引用它们
2)使用语句格式时,请保留该格式:

 for (j = 1   to S.length - 1 , i++ )
 for (i = j+1 to S.length     , ??? )

3)当你需要一些变量时,在某处声明all:A[], k.

嗯,这可能是一个更好的:

0) Start [Algo(i, j, S[], x)] 'i, j are local & S[], x are inputs
1) for (j = 1 to S.length - 1, j++ )
1.1) for (i = j + 1 to S.length, i++ )
1.1.1) if (x = S[j] + S[i])
1.1.1.1) return 'at least one match', S[i], s[j]
2) return 'No match'
3) End
华章横
2023-03-14

O(n)平均时间,如果数组较大且有许多解决方案,则更快:从包含第一个数组元素a[0]的集合开始。然后,对于i=1到(元素数量-1),检查x-A[i]是否在集合中,如果在集合中,则退出,然后向集合中添加[i]。

对于具有k个解的随机数组,这将是O(N*min(1,1/sqrt(k))。感谢Amit首先提出的集合。

如果我们正在寻找多个值x,我们将利用这样一个事实,即我们已经向集合中添加了许多值。如果我们没有找到一个x的解,然后另一个x有k个解,那么对于那个x,我们将降至O(N/k)。

吴才俊
2023-03-14

你的算法和你的算法有点小问题-

  • k从何而来?...的索引?
  • 什么是x?缺少作为参数
  • 为什么i和j是参数?
  • 为什么在i的循环中增加j而在j的循环中增加i?
  • 您似乎也在修改数组,这将产生错误的结果

应该对它进行修改,以解决这些问题,例如:

Algo(S,x)
    for (i = 1 to S.length - 1 , i++ )
       for (j= i+1 to S.length)
        t = S[j] + S[i]
        if t = x
          return S[i], S[j]
        else j++

除此之外,你的算法似乎是正确的,方法基本上是一种蛮力——你检查所有对,所以如果存在这样的对,你肯定会找到它。然而,您的方法效率很低,它在O(n^2)时间内运行。

这个问题可以用更有效的方法解决:

  1. O(nlogn)time(和少量额外空间),通过排序和迭代数组,对每个元素x进行迭代,同时对S-x进行二进制搜索,如果找到,答案就是这些元素
 类似资料:
  • 给定一组正整数和值X,找到一个其和>=X的子集S,使得sum(S)是这类已有子集所有和中的最低值。

  • 我只能想到一个朴素的算法,它列出集合的所有子集,并检查子集的和是否和是否最小,但它是一个指数算法,列出所有子集需要O(2^n)。我能用动态规划在多项式时间内求解吗?

  • 给定一组未排序的整数,返回大小为k的所有子集(即每组有k个唯一元素),其总和为0。 所以我给了面试官以下解决方案(我在GeekViewpoint上研究过)。没有使用额外的空间,一切都做到位,等等。但当然成本是O(n^k)的高时间复杂度,其中在解决方案中。 但随后她提出了以下要求: 必须在答案中使用hashmap以降低时间复杂度 必须绝对地为一般情况提供时间复杂度 k=6时的提示,O(n^3) 她对

  • 给定一个无序整数列表,以这种方式打印两个总计为的整数(int 1小于或等于int 2,它们之间用空格隔开)。假设整数列表中总是有的解。int1和int2必须是正整数。 如果有多个解决方案,请打印差异最小的整数对。 例子: 这是我的代码,但是根据我们的编译器(这是我们班的一个练习),我对隐藏的测试用例有错误的输出。 更新:代码工作!

  • NowCoder 题目描述 输入一个递增排序的数组和一个数字 S,在数组中查找两个数,使得他们的和正好是 S。如果有多对数字的和等于 S,输出两个数的乘积最小的。 解题思路 使用双指针,一个指针指向元素较小的值,一个指针指向元素较大的值。指向较小元素的指针从头向尾遍历,指向较大元素的指针从尾向头遍历。 如果两个指针指向元素的和 sum == target,那么得到要求的结果; 如果 sum > t

  • 我非常想在两个值(,)之间生成随机整数,其和等于给定的数字。 注意:我在StackOverflow中发现了类似的问题;但是,它们并没有准确地解决这个问题(使用函数,因此数字介于0和1之间)。 例如:我需要8个0到24之间的随机数(整数),其中8个生成的数字的总和必须等于24。 感谢您的帮助。谢谢