剑指 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 rightIdx−leftIdx+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
参考
以上是关于剑指 Offer 53 - I. 在排序数组中查找数字 I的主要内容,如果未能解决你的问题,请参考以下文章
算法剑指 Offer 53 - I. 在排序数组中查找数字 I
[LeetCode]剑指 Offer 53 - I. 在排序数组中查找数字 I
剑指 Offer 53 - I. 在排序数组中查找数字 I太水
剑指 Offer 53 - I. 在排序数组中查找数字 I太水