37.数字在排序数组中出现的次数
题目描述
统计一个数字在排序数组中出现的次数。
记录
方法一:
第一反应:粗暴遍历。
# -*- coding:utf-8 -*-
class Solution:
def GetNumberOfK(self, data, k):
if not data or len(data) ==0:
return 0
return data.count(k)
# -*- coding:utf-8 -*-
class Solution:
def GetNumberOfK(self, data, k):
# write code here
if not data or len(data) ==0:
return 0
num = 0
for i in data:
if i == k:
num += 1
return num
方法二:
双指针
因为是有序数组,利用左右两个指针往里收缩,知道左右两个指针指向的内容相同且等于k,则找到了k所在的区间,求出区间中元素的个数即可。
# -*- coding:utf-8 -*-
class Solution:
def GetNumberOfK(self, data, k):
# write code here
if len(data)==1:
return 1 if k in data else 0
left = 0
right = len(data)-1
while left < right:
if data[left] != k:
left += 1
if data[right] != k:
right -= 1
if data[left] == k and data[right] == k:
return right - left + 1
return 0
方法三:
二分查找
和方法二差不多。
# -*- coding:utf-8 -*-
class Solution:
def GetNumberOfK(self, data, k):
# write code here
left = 0
right = len(data)-1
leftk = self.getleftK(data,k,left,right)
rightk = self.getrightK(data,k,left,right)
return rightk - leftk + 1
#左指针
def getleftK(self, data, k, left, right):
while left <= right:
middle = (left + right) // 2
if data[middle] < k:
left = middle + 1
else:
right = middle - 1
return left
#右指针
def getrightK(self, data, k, left, right):
while left <= right:
middle = (left + right) // 2
if data[middle] <= k:
left = middle + 1
else:
right = middle - 1
return right
参考:参考