6.3 知识迁移能力
描述: 统计一个数字在排序数组中出现的次数。
solution1. 哈希
直接利用哈希表存储;
时间复杂度是O(n);
解法并不是最优的,而且没有利用排序数组这个信息;
solution2. 二分查找
利用二分查找,先找到这个数字,然后再顺序遍历,得到出现的次数;
时间复杂度依然是O(n),不可取;
solution3. 二分查找改进版
如果我们可以利用二分查找,找到k出现的第一次和最后一次,问题就解决。
如下:
# -*- coding:utf-8 -*-
class Solution:
def GetFirstIndexOfK(self, data, start, end, k):
if start > end:
return -1
mid = (start + end) // 2
if data[mid] == k:
if mid == 0 or (mid > 0 and data[mid-1] != k) :
return mid
else:
end = mid-1
elif data[mid] < k:
start = mid + 1
else:
end = mid - 1
return self.GetFirstIndexOfK(data, start, end, k)
def GetLastIndexOfK(self, data, start, end, k):
if start > end:
return -1
mid = (start + end) // 2
if data[mid] == k:
if (mid < end and data[mid+1] != k) or mid == end :
return mid
else:
start = mid+1
elif data[mid] < k:
start = mid + 1
else:
end = mid - 1
return self.GetLastIndexOfK(data, start, end, k)
def GetNumberOfK(self, data, k):
# write code here
start = 0
end = len(data)-1
firstIdex = self.GetFirstIndexOfK(data, 0, end, k)
endIdex = self.GetLastIndexOfK(data, 0, end, k)
if firstIdex > -1 and endIdex > -1:
return endIdex - firstIdex + 1
else:
return 0