题目描述
Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋
times.
Note: The algorithm should run in linear time and in O(1) space.
Example 1:
1 | Input: [3,2,3] |
Example 2:
1 | Input: [1,1,1,3,3,2,2,2] |
如果要满足O(1)的space complexity的话,这是挺难的一道题。
由于需要找的数字最多只有两个,我们设置两个计数器,分别记录最有可能返回的两个值,以及他们记数的大小。
在遍历的时候,如果遍历到除了这两个数字之外的其他数字,就给他们两个的记述器都减1,如果遍历到与这两个数字相同的数字,就给相同的那个计数器加1.当某个计数器为0的时候,下一次遍历就可以将该计数器所对应的数字记为该新数字。
之所以这样做,是因为我们只需要记录最有可能的数字,如果说遍历到中途,某个数字的计数器变成0了,就说明它在当前的序列里,占比不会超过1/3,所以它一定不可能。
关于这题的理解我也并不是很透彻,已经标注了star
代码实现
1 | class Solution: |