我在LeetCode上遇到了一个麻烦的问题(搜索旋转排序数组)。
由于某种原因,我的代码总是出现一些问题,所以我不得不查找解决方案。目前我拥有的代码,在查找不存在的目标数字时仍然会无限循环。
我希望能够得到一些帮助,理解是否有更直观的方法来解决这个问题,并帮助修复我的代码。
我认为我不应该需要这一行代码:
此外,以这样的示例为例
由于某种原因,我的代码总是出现一些问题,所以我不得不查找解决方案。目前我拥有的代码,在查找不存在的目标数字时仍然会无限循环。
我希望能够得到一些帮助,理解是否有更直观的方法来解决这个问题,并帮助修复我的代码。
我认为我不应该需要这一行代码:
if nums[mid] == target or nums[low] == target or nums[high] == target:
return target
我想知道如何确保我的代码能够在没有指定条件语句的情况下,对于包含1-3个数字的数组找到目标。以下是几个示例:
print(search([1, 2, 3], 1))
print(search([1], 1))
print(search([2, 1], 1))
此外,以这样的示例为例
print(search([5, 1, 2, 3, 4], 6))
,我的代码从未返回-1
。def search(nums, target):
low = 0
high = len(nums)-1
while low <= high:
mid = (low + high) // 2
if nums[mid] == target or nums[low] == target or nums[high] == target:
return target
if nums[mid] <= nums[high]:
if target > nums[mid] and target <= nums[high]:
low = mid + 1
else:
high = mid - 1
elif nums[mid] > nums[low]:
if target >= nums[low] and target < nums[mid]:
high = mid - 1
else:
low = mid+1
return -1
print(search([1, 2, 3], 1))
print(search([5, 4, 1, 2, 3], 2))
print(search([3, 4, 5, 1, 2], 2))
print(search([1], 1))
print(search([2, 1], 1))
print(search([5, 1, 2, 3, 4], 6))
我看到许多与上面代码类似的解决方案,人们说它是O(logn)
,但是我不理解,因为我们每次只将low
和high
移动1步。这让我相信该解决方案在最坏情况下是O(n)
。
希望能得到一些帮助!
low
和high
向左或向右移动 1 个单位。你是将它们从中间移动 1 个单位(因为你已经测试过middle
不包含正确的值)。因此,在每一步中,你都会将搜索空间减半,使其成为O(log n)
。 - JohanL