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

一、题目

题目描述:
Leetcode 剑指 Offer 53 - I. 在排序数组中查找数字 I_第1张图片

二、思路

题目给出的条件是有序数组,第一反应应该是采用二分法。这里关键是要找出第一个比target值小的元素以及第一个比target值大的元素,需要调用两次二分法分别确定出左边界和右边界。
Leetcode 剑指 Offer 53 - I. 在排序数组中查找数字 I_第2张图片

三、代码

class Solution:
    def search(self, nums: List[int], target: int) -> int:
        # 搜索右边界 right
        i, j = 0, len(nums)-1
        while i <= j:
            m = (i + j) // 2
            if nums[m] <= target: i = m + 1
            else: j = m - 1
        right = i
        # 若数组中无target,则提前返回
        if j >= 0 and nums[j] != target: return 0
        # 搜索左边界 left
        i = 0
        while i <= j:
            m = (i + j) // 2
            if nums[m] >= target: j = m - 1
            else: i = m + 1
        left = j
        return right - left - 1

四、复杂度分析

在这里插入图片描述

你可能感兴趣的:(编程题)