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

Posted 炫云云

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指 Offer 53 - I. 在排序数组中查找数字 I相关的知识,希望对你有一定的参考价值。

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

二分查找

考虑 target \\textit{target} target 开始和结束位置,其实我们要找的就是数组中「第一个等于 target \\textit{target} target 的位置」(记为 leftIdx \\textit{leftIdx} leftIdx )和「第一个大于 target \\textit{target} target 的位置减一」(记为 rightIdx \\textit{rightIdx} rightIdx)。

定义一个二分查找,寻找 leftIdx \\textit{leftIdx} leftIdx 即为在数组中寻找第一个等于 target \\textit{target} target 的下标,寻找 rightIdx \\textit{rightIdx} rightIdx 即为在数组中寻找第一个大于 target \\textit{target} target 的下标,然后将下标减一,即为最后一个位置。

最后,因为 target \\textit{target} target 可能不存在数组中,因此我们需要重新校验我们得到的两个下标 leftIdx \\textit{leftIdx} leftIdx rightIdx \\textit{rightIdx} rightIdx,看是否符合条件,如果符合条件就返回 rightIdx − leftIdx + 1 \\textit{rightIdx}-\\textit{leftIdx}+1 rightIdxleftIdx+1 ,不符合就返回 0 0 0

class Solution(object):
    def search(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        def binarySearch(nums, target):
            left =0
            right = len(nums) -1
            while left<=right:
                mid = left+(right-left)//2
                if nums[mid]<target:# 应该继续向右边找,搜索区间变为 [mid+1, right]
                    left = mid+1
                else:
                    right = mid  -1  #应该继续向左边找 ,搜索区间变为 [left, mid  -1]
                    #寻找第一个满足条件的点, 即使得right在满足target的数的最左边,即寻找左边界
            return left
        leftIdx = binarySearch(nums, target)
        print(leftIdx)
        rightIdx = binarySearch(nums, target+1) -1
        print(rightIdx)

        if leftIdx == len(nums) or nums[leftIdx] !=target:
            return 0
        else:
            return rightIdx - leftIdx +1

s= Solution()
s.search(nums = [1], target = 1)
1
0
0

参考

Krahets - 力扣(LeetCode) (leetcode-cn.com)

以上是关于剑指 Offer 53 - I. 在排序数组中查找数字 I的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

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

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

每日一题 - 剑指 Offer 53 - I. 在排序数组中查找数字 I