前言
今天这篇继续来研究算法。今天是关于Majority Vote的算法,算法题也是leetcode上一道非常经典的题目。
leetcode原题
这是原题的链接leetcode.com/problems/ma… 。
其实我感觉有点像找一个数组中的众数。原题还有一个follow-up question,问能不能给出space complexity为O(1)的算法。
暴力破解
其实这个算法不论是用暴力破解还是接下来要讲的Majority Vote算法,时间复杂度都是O(n)。两个算法差在了space complexity上。
暴力破解可以用一个hashmap实现,key存数组中的唯一值,value存该值出现的次数。
最后找出value最大值所对应的key就可以了。
Majority Vote算法
这个算法需要一个指向当前元素的 一个 counter,以及一个记录当前元素数值的 current。
在最开始的时候,counter的数值是0,current的数值是未知的。
然后开始遍历数组。
如果 counter 的数值是0,那么我们就给它+1,并把当前位置的值赋给 pointer,如果不是0,那么我们就按照现在位置的数值对counter进行加减:
如果现在位置上的数值和 current 一样,就+1
如果现在位置上的数值不是 current,就-1
直到遍历结束,此时 current 的值就是我们想要的出现次数最多的数。
假设我们有一个数组是[1,2,5,5,5,6,6]
我们的从位置0开始,此时我们的 counter的值就变成了1, current的值是1。
下一个是位置1,counter又变成了0,current = 1
下一个是位置2,counter = 1,current = 5
位置3,counter = 2,current = 5
位置4,counter = 3,current = 5
位置5,counter = 2,current = 5
位置6,counter = 1,current = 5
遍历结束,current = 5,因此这个数组里出现次数最多的数字就是5。
算法链接: www.cs.utexas.edu/~moore/best…
作者还给了很详细的动画演示,可以参考一下。