描述一个算法,其中给定一组由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++
我想你需要一些标准:
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
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)。
你的算法和你的算法有点小问题-
k
从何而来?...的索引?x
?缺少作为参数应该对它进行修改,以解决这些问题,例如:
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)
时间内运行。
这个问题可以用更有效的方法解决:
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。 感谢您的帮助。谢谢