给定数组a[]
,确定至少一个元素i
是否满足条件a[i] == i
的最有效方法是什么?
数组中的所有元素都是有序且不同的,但它们不一定是整数类型(即它们可能是浮点类型)。
答案 0 :(得分:4)
在最坏的情况下,你不能做比检查每个元素更好的事情。 (想象一下a[i] = i + uniform_random(-.25, .25)
之类的内容。)您需要一些关于输入内容的信息。
答案 1 :(得分:1)
实际上我会从最后一个元素开始,并进行基本检查(例如,如果你有1000个元素,但最高为100,你知道你只需要检查0..100)。在最糟糕的情况下,您仍然需要检查每个元素,但找到可能的区域应该更快。如果它如上所述(a [i] = i + [-0.25..0.25]),你就是f($!ed并且需要搜索每一个元素。
答案 2 :(得分:0)
对于已排序的数组,您可以执行插值搜索。与binary search类似,但假设值均匀分布,可以更快。
答案 3 :(得分:0)
我认为这里的主要问题是你的冲突陈述:
a [i] == 我
数组中的所有元素都是排序且不同,它们不一定是整数。
如果数组的值等于其访问下标,则表示它是一个整数。如果它不是整数,并且它们说.. char
,那么什么被认为是“排序的”? ASCII值(A < B < C
)?
如果是一系列字符,我们会考虑:
a[i] == i
如果,是真的
i == 65 10 &amp;&amp; a [i] =='A'
如果我在这次采访中,我会在回答问题之前给面试官提供跟进问题。那说......
如果我们所知道的只是你所说的,我们可以肯定地说我们可以在O(n)中找到值,因为这是完成数组一次完整传递的时间。有了更多细节,我们可以通过二进制搜索数组将其限制为O(log(n))。
答案 4 :(得分:0)
注意到数组中的所有元素都是已排序且不同,所以如果我们用数组中的b [i] = a [i] -i,元素构造一个新数组b b也是排序,我们需要找到的是在数组b中找到零。我认为二分搜索可以解决问题!这是一个link,用于计算排序数组中出现的次数。你也可以做类似的Divide&amp;在原始数组上征服技术而不构造辅助数组!时间复杂度为O(Logn)!
Take this as an example:
a=[0,1,2,4,8]
b=[0,0,0,1,4]
What we need to find is exactly index 0,1,2
希望它有所帮助!