第2章 面试需要的基础知识
第3章 高质量的代码
第4章 解决面试题的思路
第5章 优化时间和空间效率
面试题39 : 数组中出现次数超过一半的数字
面试题40 : 最小的k个数
面试题42 : 连续子数组的最大和
面试题43 : 从1到n整数中1出现的次数
面试题45 : 把数组排成最小的数
面试题49 : 丑数
面试题50 : 第一个只出现一次的字符
面试题51 : 数组中的逆序对
面试题52 : 两个链表的第一个公共结点
面试题53 : 在排序数组中查找数字
第6章 面试中的各项能力
第7章 两个面试案例
题目描述
统计一个数字在排序数组中出现的次数。
解题思路
排序数组首先想到用二分法。先找到数字在数组中的位置,然后将数组分为左右半区,分别在左半区查找起始点,在右半区查找截止点。
实战
class Solution:
def GetNumberOfK(self, data, k):
# write code here
if not data or k < data[0] or k > data[-1]:
return 0
start, end = 0, len(data) - 1
mid = 0
# 先找到k的位置
while start < end:
mid = (start + end) // 2
if data[mid] > k:
end = mid - 1
elif data[mid] < k:
start = mid + 1
else:
break
end_mid, start_mid = mid, mid
# 在左半区查找起始点
while start < end_mid:
left_mid = (start + end_mid) // 2
if data[left_mid] < k:
start = left_mid + 1
else:
end_mid = left_mid - 1
# 在右半区查找截止点
while start_mid < end:
right_mid = (start_mid + end) // 2
if data[right_mid] > k:
end = right_mid - 1
else:
start_mid = right_mid + 1
return end - start + 1