题目来源:(两道题仅返回值不同)
https://leetcode-cn.com/problems/zai-pai-xu-shu-zu-zhong-cha-zhao-shu-zi-lcof/
https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
你的算法时间复杂度必须是 O(log n) 级别。
思路:
看到“排列数组”,第一反应就得是二分查找。但是一般的二分,如果在中点处刚好找到一个数等于target,那接下来往哪边走呢?没办法判断,所以考虑用两次二分,一次找起始下标,一次找结束下标。(注意找结束下标时mid=(low+high+1)//2,以及一些特殊情况的判断)
class Solution(object):
def searchRange(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
low, high = 0, len(nums)-1 # 第一次二分,找起始下标
while low < high:
mid = (low + high) // 2
if nums[mid] >= target:
high = mid
else:
low = mid + 1
if not nums or nums[low] != target:
return [-1, -1]
left = low
low, high = 0, len(nums)-1 # 第二次二分,找结束下标
while low < high:
mid = (low + high + 1) // 2 # 注意+1,不然会死循环
if nums[mid] <= target:
low = mid
else:
high = mid - 1
right = high
return [left, right] # 统计次数时返回right-left+1
参考: