下面给出了问题陈述和解决方案。我无法理解解决方案背后的逻辑。
问题陈述:
给定一个数组包含n+1个整数,其中每个整数介于1和n之间,证明至少存在一个重复的数字。假设只有一个重复的数字,找到重复的一个。
class Solution(object):
def findDuplicate(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
low = 1
high = len(nums)-1
while low < high:
mid = low+(high-low)/2
count = 0
for i in nums:
if i <= mid:
count+=1
if count <= mid:
low = mid+1
else:
high = mid
return low
首先,搜索空间是1到n之间的数字。每次我选择一个数字mid(它是中间的那个),并计算所有等于或小于mid的数字。如果计数大于mid,则搜索空间为[1 mid],否则为[mid+1n]。我这样做,直到搜索空间只有一个数字。
假设n=10,我选择mid=5。然后我对数组中小于等于MID的所有数字进行计数。如果有超过5个小于5的数字,那么根据鸽子洞原则(https://en.wikipedia.org/wiki/Pigeonhole_principal),其中一个已经发生了不止一次。所以我将搜索空间从[110]缩小到[15]。否则,重复的数字在后半部分,因此对于下一步,搜索空间将是[610]。
疑问:在上面的解决方案中,当count<=mid
时,为什么要将low
更改为low=mid+1
或将high=mid
更改为low=mid
?背后的逻辑是什么?
我无法理解这个算法背后的逻辑
相关链接:https://discuss.leetcode.com/topic/25580/two-solutions-with-explaination-o-nlog-n-and-o-n-time-o-1-space-noth-change-the-input-array
这是一个二分搜索。您正在将搜索空间削减一半并重复。
这样考虑一下:您有一个包含101项的列表,并且您知道它包含值1-100。走到一半,50。计算有多少项小于或等于50。如果有超过50项小于或等于50项,则重复项在0-50范围内,否则重复项在51-100范围内。
二分搜索只是将范围减半。看0-50,取中点25,重复。
inspection_count=0
for i in nums:
inspection_count+=1
if i <= mid:
count+=1
p = 0, q = 5, n = 10
"I have ten values, and every value is between zero and five.
At least one of these values must be duplicated."
我们可以概括这一点,但一个更有效和相关的例子是
p = 50, q = 99, n = 50
"I have a collection of fifty values, and every value is between fifty and ninety-nine.
There are only forty nine *distinct* values in my collection.
Therefore there is a duplicate."
我写了一个函数来寻找目标值在给定数组中应该插入的位置。我们假设数组有不同的值,并按升序排序。我的解必须是O(log N)时间复杂度 此代码的复杂性是否为O(log N)?
我偶然看到了这篇关于动态数组时间复杂性的文章,它澄清了很多。然而,我有一个基于案例的问题。假设我有一个总共有6个元素的动态数组,假设删除了第4个元素。在这种情况下,删除复杂度将是,这将是,因为最后两个元素只需要向上移动。这是正确的吗?我有一些文章给出了最坏情况下的复杂度,说如果删除最顶部的元素,那么时间复杂度将是。我找不到任何关于从中心移除/插入项目的内容。
我最近了解了杂耍算法如何在线性时间内旋转数组 时间复杂度如何线性???
主要内容:时间复杂度,空间复杂度《 算法是什么》一节提到,解决一个问题的算法可能有多种,这种情况下,我们就必须对这些算法进行取舍,从中挑选出一个“最好”的。 算法本身是不分“好坏”的,所谓“最好”的算法,指的是最适合当前场景的算法。挑选算法时,主要考虑以下两方面因素: 执行效率:根据算法所编写的程序,执行时间越短,执行效率就越高; 占用的内存空间:不同算法编写出的程序,运行时占用的内存空间也不相同。如果实际场景中仅能使用少量的内
假设T是具有n个节点和高度h的二叉查找树。T的每个节点x存储一个实数x。键。给出以下算法Func1(T. root)的最坏情况时间复杂度。你需要证明你的答案。 x.left() 对于最坏情况下的运行时,我认为这将是O(树的高度),因为这基本上类似于最小()或最大()二元搜索树算法。然而,它是递归的,所以我对是否将O(h)作为最坏的运行时编写有点犹豫。 当我考虑它时,最坏的情况是如果函数执行if(s
在Google上的几个帖子(例如,https://cs . stack exchange . com/questions/125995/median-of-medians-proof-for-time-complexity)和文章中,我看到了为中位数写的以下时间复杂度递归: <代码> T(n) 但是我很困惑,因为这种递归似乎认为MoM嵌入到快速选择中,因此是快速选择的递归公式,用于在使用MoM查找