阅读目录
题目描述
统计一个数字在排序数组中出现的次数。
思路及Python实现
思路一:二分查找
- 由于数组是排序数组,而且都是整数。因此不用查找k的左右位置,只需要找到 k-0.5 和 k+0.5 的插入位置,然后左右相减即可。既然是排序数组,那么就可以用二分法查找
class Solution:
def find_k(self, data, k):
left_index = 0
right_index = len(data) - 1
while left_index <= right_index:
mid_index = (left_index + right_index) >> 1
if data[mid_index] < k:
left_index = mid_index + 1
if k < data[mid_index]:
right_index = mid_index - 1
return right_index
def GetNumberOfK(self, data, k):
if not data:
return 0
else:
return self.find_k(data, k + 0.5) - self.find_k(data, k - 0.5)
obj = Solution()
print(obj.GetNumberOfK([1, 2, 2, 2, 3, 5], 2))
直接找该值得最左和最右两个位置
class Solution:
def get_left(self, data, k, left, right):
while left <= right:
mid = (left + right) // 2
if data[mid] >= k:
# 注意,传统的二分法没有等号,如果相等了,就直接返回mid了,但是这个有点特殊
right = mid - 1
else:
left = mid + 1
return left
# 找data中最后一次出现k的下标
def get_right(self, data, k, left, right):
while left <= right:
mid = (left + right) // 2
if data[mid] > k:
right = mid - 1
else: # 注意,其他情况要包括等于
left = mid + 1
return right
def GetNumberOfK(self, data, k):
# write code here
left = 0
right = len(data) - 1
right_k = self.get_right(data, k, left, right)
left_k = self.get_left(data, k, left, right)
return right_k - left_k + 1