我是堆栈溢出的新手。我希望这个问题符合指导方针。 thnakyou。!
class Solution:
def searchRange(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
start = self.firstGreaterEqual(nums, target)
if start==len(nums) or nums[start]!=target:
return [-1, -1]
return [start, self.firstGreaterEqual(nums, target+1)-1]
def firstGreaterEqual(self, nums, target):
lo, hi = 0, len(nums)
while lo<hi:
mid = (hi+lo)//2
if nums[mid]<target:
lo = mid + 1
else:
hi = mid
return lo
Input: nums = [5,7,7,8,8,10], target = 6
Output: [-1,-1]
Input: nums = [5,7,7,8,8,10], target = 8
Output: [3,4]
该程序用于搜索范围 link to the program 该解决方案具有最佳的运行时间。 我发现很难理解其背后的逻辑。 它正在使用二进制搜索,但我还没有完全理解它。
答案 0 :(得分:1)
因此,正如您所指出的,它基本上是在二进制搜索的原理上工作。
这是简单明了的算法
然后找到target+1
的第一个出现位置,假设该出现位置存储在变量end
中,那么原始target
的最后一个出现位置将是`end -1 < / p>
首先,您发现所寻找目标的首次出现
示例数组nums = [5,7,7,8,8,10], target = 8
lo = 0
,hi = len(nums)
,mid = (hi+lo)//2
mid = 3
start
现在,因为我们是第一次出现,所以我们进入了下一个阶段
然后找到target+1
lo = 0
,hi = len(nums)
,mid = (hi+lo)//2
,target+1 = 9
mid = 3
target+1
,因此我们将low = mid +1
设置为mid = (hi+lo)//2
设置为5 target+1
,因此我们将hi = mid
设置为while loop
的计算结果为False,我们退出了while lo<hi
lo
作为结束索引现在我们有start = 3,end = 5,所以我们返回[start,end-1],即[3,4]
参考: