0 题目描述
leetcode原题链接:剑指 Offer 53 - I. 在排序数组中查找数字 I
1 二分查找
解题思路:
排序数组中的搜索问题,首先想到 二分法 解决。
排序数组 nums 中的所有数字 target 形成一个窗口,记窗口的 左 / 右边界 索引分别为 left 和 right ,分别对应窗口左边 / 右边的首个元素。
本题要求统计数字 target 的出现次数,可转化为:使用二分法分别找到 左边界 left 和 右边界 right ,易得数字 target 的数量为right−left+1 。
class Solution:
def search(self, nums: List[int], target: int) -> int:
if not nums or len(nums) == 0: return 0
left = self.findFirstTarget(nums, target)
right = self.findLastTarget(nums, target)
if left == -1: return 0
return right - left + 1
def findFirstTarget(self, nums, target):
left, right = 0, len(nums) - 1
while left <= right:
mid = (left + right) // 2
if nums[mid] == target:
right = mid - 1
elif nums[mid] < target:
left = mid + 1
else:
right = mid - 1
if left != len(nums) and nums[left] == target:
return left
return -1
def findLastTarget(self, nums, target):
left, right = 0, len(nums) - 1
while left <= right:
mid = (left + right) // 2
if nums[mid] == target:
left = mid + 1
elif nums[mid] < target:
left = mid + 1
else:
right = mid - 1
return right