《剑指Offer》刷题笔记——面试题53-I. 在排序数组中查找数字

难度:简单

一、题目描述:

在这里插入图片描述

二、解题分析:

1、剑指解析

在这里插入图片描述

2、代码实现

I、剑指思路

class Solution:
    def extreme_insertion_index(self, nums, target, left):
        lo = 0
        hi = len(nums)

        while lo < hi:
            mid = (lo + hi) // 2
            if nums[mid] > target or (left and target == nums[mid]):
                hi = mid
            else:
                lo = mid+1

        return lo

    def search(self, nums: List[int], target: int) -> int:
        left_idx = self.extreme_insertion_index(nums, target, True)

        # assert that `left_idx` is within the array bounds and that `target`
        # is actually in `nums`.
        if left_idx == len(nums) or nums[left_idx] != target:
            return 0

        return self.extreme_insertion_index(nums, target, False)-left_idx     

II、二分统计

class Solution:
    def __init__(self):
        self.count = 0
    def search(self, nums: List[int], target: int) -> int:
        #递归的停止条件
        if len(nums) == 0: return 0
        #binary search
        mid = len(nums)//2
        if nums[mid]==target:
            self.count = self.count+1
            self.search(nums[:mid],target)
            self.search(nums[mid+1:],target)
        if nums[mid]<target:
            self.search(nums[mid+1:],target)
        if nums[mid]>target:
            self.search(nums[:mid],target)
        return(self.count)

III、线性扫描头尾

class Solution:
    def search(self, nums: List[int], target: int) -> int:
        for i in range(len(nums)):
            if nums[i] == target:
                left_idx = i
                break
        else:
            return 0
        # find the index of the rightmost appearance of `target` (by reverse
        # iteration). it is guaranteed to appear.
        for j in range(len(nums)-1, -1, -1):
            if nums[j] == target:
                right_idx = j
                break

        return right_idx-left_idx+1
发布了132 篇原创文章 · 获赞 154 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_34108714/article/details/104752792