gpt4 book ai didi

algorithm - 检查未排序数组 a 中是否存在 a[i] = 2*a[j]?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:38:19 24 4
gpt4 key购买 nike

给定一个未排序的整数序列 a[1,...,n],给出一个 O(nlogn) 运行时算法来检查是否有两个索引 i 和 j 使得 a[i] =2*a[j ].该算法应在输入 4、12、8、10 上返回 i=0 和 j=2,在输入 4、3、1、11 上返回 false。

我认为无论如何我们都必须对数组进行排序,时间复杂度为 O(nlogn)。我不确定在那之后该怎么做。

最佳答案

注意:平均可以在 O(n)1 上完成,使用 hash table .

set <- new hash set
for each x in array:
set.add(2*x)
for each x in array:
if set.contains(x):
return true
return false

证明:
=>
如果有 2 个元素 a[i]a[j] 使得 a[i] = 2 * a[j],然后在第一次迭代时,我们在读取a[j]时将2*a[j]插入集合。在第二次迭代中,我们发现 a[i] == 2* a[j] 在集合中,并返回 true。

<=
如果算法返回真,则它发现 a[i] 使得 a[i] 已经在第二次迭代的集合中。因此,在第一次迭代期间 - 我们插入了 a[i]。这只有在存在第二个元素 a[j] 使得 a[i] == 2 * a[j] 时才能完成,我们插入了 a[i] 在阅读 a[j] 时。

注意:
为了返回元素的索引,可以简单地使用 HashMap 而不是集合,并且对于每个i存储2 *a[i] 作为键,i 作为值。

示例:
输入 = [4,12,8,10]

首先对每个x - 2x插入到哈希表中,并进行索引。你会得到:

哈希表 = {(8,0),(24,1),(16,2),(20,3)}

现在,在第二次迭代中,您检查每个元素是否在表中:

arr[0]: 4 is not in the table
arr[1]: 12 is not in the table
arr[2]: 8 is in the table - return the current index [2] and the value of 8 in the map, which is 0.

因此,最终输出为 2,0 - 正如预期的那样。


(1) 复杂性通知:
在这里,O(n) 假定O(1) 哈希函数。这并非总是如此。如果我们确实假设 O(1) 哈希函数,我们也可以假设使用基数排序的排序是 O(n),并使用 的后处理O(n) [类似于@SteveJessop 在他的回答中建议的],我们也可以使用基于排序的算法实现 O(n)

关于algorithm - 检查未排序数组 a 中是否存在 a[i] = 2*a[j]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9957310/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com