算法总结之Majority Vote | 青训营

113 阅读2分钟

前言

今天这篇继续来研究算法。今天是关于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… 作者还给了很详细的动画演示,可以参考一下。