LeetCodeEasy-【面試題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 <= 數組長度 <= 50000

注意:本題與主站 34 題相同(僅返回值不同):https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/zai-pai-xu-shu-zu-zhong-cha-zhao-shu-zi-lcof
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

思路1:遍歷

直接遍歷統計
在這裏插入圖片描述

class Solution:
    def search(self, nums: List[int], target: int) -> int:
        cnt = 0
        for n in nums:
            if n == target:
                cnt += 1
        return cnt

思路2:二分

由於題目給出的條件是有序的數組,所以目標值是在一起的,所以我們只需要確定目標值的區間就行,然後區間長度就是要求的個數。可以從兩端搜索區間左端點和右端點,也可以利用二分查找,找出區間的左端點有右端點。
有時間總結下二分的各種寫法。
在這裏插入圖片描述

class Solution:
    def search(self, nums: List[int], target: int) -> int:
        # 基於排序數組,利用二分找到目標區間:
        l1, r1 = 0, len(nums) - 1
        while l1 <= r1:
            mid = (l1 + r1) >> 1
            if nums[mid] >= target:
                r1 = mid - 1
            else:
                l1 = mid + 1
        l2, r2 = 0, len(nums) - 1
        while l2 <= r2:
            mid = (l2 + r2) >> 1
            if nums[mid] > target:
                r2 = mid - 1
            else:
                l2 = mid + 1
        # print(l1, r1)
        # print(l2, r2)
        return l2 - r1 - 1
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章