剑指 Offer 53 - I. 在排序数组中查找数字 I
统计一个数字在排序数组中出现的次数。
示例 1:
输入: nums = [5,7,7,8,8,10], target = 8
输出: 2
示例 2:
输入: nums = [5,7,7,8,8,10], target = 6
输出: 0
提示:
0 <= nums.length <= 105
-109 <= nums[i] <= 109
nums 是一个非递减数组
-109 <= target <= 109
注意:本题与主站 34 题相同(仅返回值不同):
https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/
解题思路:
代码实现:
暴力解法:
class Solution:
def search(self, nums: List[int], target: int) -> int:
count = 0
n = len(nums)
for i in range(0, n):
if nums[i] == target :
count += 1
return count
二分查找法:
class Solution:
def search(self, nums: List[int], target: int) -> int:
def findRightPos(x):
L, R = 0, len(nums)-1
while L<= R:
m = L+(R-L)//2
if nums[m] <= x:
L = m + 1
else:
R = m - 1
return L
return findRightPos(target) - findRightPos(target-1)
class Solution:
def searchRange(self, nums: List[int], target: int) -> List[int]:
def searchLeft(nums,target):
left, right = 0, len(nums)
while left < right:
mid = left + (right-left) // 2
if nums[mid] == target:
right = mid
elif nums[mid] < target:
left = mid + 1
elif nums[mid] > target:
right = mid
if left == len(nums):
return -1
return left if nums[left] == target else -1
def searchRight(nums,target):
left, right = 0, len(nums)
while left < right:
mid = left + (right-left) // 2
if nums[mid] == target:
left = mid + 1
elif nums[mid] < target:
left = mid + 1
elif nums[mid] > target:
right = mid
if right == 0:
return -1
return right-1 if nums[right-1] == target else -1
return [searchLeft(nums,target),searchRight(nums,target)]