题目
给定整数数组arr,打印其中出现次数大于一半的数, 如果没有这样的数,打印提示信息。
进阶问题:
给定整数数组arr,打印其中出现次数大于N/K的数,如果没有这样的数,打印提示信息。
要求
原问题要求时间复杂度O(n), 空间复杂度O(1),
进阶问题要求时间复杂度O(N×K),额外空间O(K)
解答
核心思路:一次在数组中删掉K个不同的数,不停地删除,直到剩下数的种类不足K就停止删除,那么,如果一个数在数组中出现次数大于N/K,则这个数最后一定会被剩下来。
注:这里有一个很重要的事实,那就是出现次数大于n/k的元素的个数至多为(k-1)个,比如出现次数大于n/3的至多只有两个。
原问题代码:
def printHalfMajor(arr):
cand = 0
times = 0
for i in arr:
if times==0:
cand = i
times += 1
elif i == cand:
times += 1