剑指 Offer 53 - I. 在排序数组中查找数字 I | 算法

83 阅读1分钟

剑指 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)

leetcode-cn.com/problems/fi…

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)]