数字在排序数组中出现的次数
时间限制:1秒 空间限制:32768K 热度指数:218266
本题知识点: 数组
算法知识视频讲解
题目描述
统计一个数字在排序数组中出现的次数。
法1.内置count()函数
class Solution:
def GetNumberOfK(self, data, k):
# write code here
# 法1.
return data.count(k)
法2.二分法
# -*- coding:utf-8 -*-
class Solution:
def GetNumberOfK(self, data, k):
# write code here
if not data:
return 0
l = self.GetFirstK(data, k)
r = self.GetLastK(data, k)
if l == -1 and r == -1:
return 0
return r - l + 1
def GetFirstK(self, data, k):
low = 0
high = len(data) - 1
while low <= high:
mid = (low + high) // 2
if data[mid] < k:
low = mid + 1
elif data[mid] > k:
high = mid - 1
else:
if mid == low or data[mid - 1] != k: #当到list[0]或不为k的时候跳出函数
return mid
else:
high = mid - 1
return -1
def GetLastK(self, data, k):
low = 0
high = len(data) - 1
while low <= high:
mid = (low + high) // 2
if data[mid] > k:
high = mid - 1
elif data[mid] < k:
low = mid + 1
else:
if mid == high or data[mid + 1] != k:
return mid
else:
low = mid + 1
return -1
high = len(data) - 1
while low <= high:
mid = (low + high) // 2
if data[mid] > k:
high = mid - 1
elif data[mid] < k:
low = mid + 1
else:
if mid == high or data[mid + 1] != k:
return mid
else:
low = mid + 1
return -1
updata:2019年10月7日
这里放两个失败案例:
1.二分查找high = mid - 1
比high = mid
快
这里与上边儿代码最大的不同是在二分查找的时候用的high = mid
。
# -*- coding:utf-8 -*-
class Solution:
def GetNumberOfK(self, data, k):
# write code here
l = self.binary_search_first(data, k)
r = self.binary_search_last(data, k)
if not l and not r:
return 0
else:
return r - l + 1
def binary_search_first(self, data, k):
l, r = 0, len(data) - 1
while l < r:
mid = (l + r) // 2
item = data[mid]
if item > k:
r = mid
elif item < k:
l = mid
elif item == k:
if mid == l or data[mid - 1] != k:
return mid
else:
r = mid
return None
def binary_search_last(self, data, k):
l, r = 0, len(data) - 1
while l < r:
mid = (l + r) // 2
item = data[mid]
if item > k:
r = mid
elif item < k:
l = mid
elif item == k:
if mid == r or data[mid + 1] != k:
return mid
else:
l = mid
return None
2.两个二分查找比一个二分查找快
这个是只用一个二分查找找到index,然后向左向右扩展,计数。
运行超时:原因是k的大小如果很大,就会没有两个二分查找快。
# -*- coding:utf-8 -*-
class Solution:
def GetNumberOfK(self, data, k):
# write code here
mid = self.binary_search(data, k)
if mid:
count = 1
l, r = mid - 1, mid + 1
while l >= 0:
if data[l] == k:
count += 1
l -= 1
else:
break
while r < len(data):
if data[r] == k:
count += 1
r += 1
else:
break
return count
else:
return 0
def binary_search(self, data, k):
l, r = 0, len(data) - 1
while l < r:
mid = (l + r) // 2
item = data[mid]
if item > k:
r = mid
elif item < k:
l = mid
elif item == k:
return mid
return None