找到数组中频次大于1/k的数
Majority Number III
给定一个数组(长度为L),找到所有出现频次大于1/k的数字。
我们主要使用摩尔投票法(Voting Algorithm)结合Map的数据结构解决此问题。其时间复杂度O(n),空间复杂度O(k)。
主元素数量大于数组长度的1/k,因此有k-1一个候选人(Candidate),通过loop整个数组两次得到答案,遍历第一次找有可能的候选人,第二次统计这些候选人出现的频次。
当数组长度L小于k时,直接对所有出现的数字进行统计得到结果。
当数组长度L大于等于k时,建立一个以<candidate, counter>的容量为k-1的Map,遍历数据进行统计,如果Map的容量未满k-1或者存在candidate的频次为0,将遇到的数字选为candidate; 如果Map的容量已满k-1且所有candidate的频次不为零则所有candidate的频次–。
References:
[1]https://www.zhihu.com/question/49973163
相关文章