问题
给定一个大小为 n 的数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。
说明: 要求算法的时间复杂度为 O(n),空间复杂度为 O(1)。
例子
思路
-
方法1
>1/3的数,最多为2个,根据投票法,选出来两个最多的,然后把>1/3的数放入list
-
方法2
代码
//方法1
class Solution {
public List<Integer> majorityElement(int[] nums) {
List<Integer> list = new ArrayList<>();
if (nums.length == 0) return list;
//开始如何设置很重要
int a=nums[0],ca=0;
int b=nums[0],cb=0;
for (int num : nums) {
if(a==num) ca++;
else if(b==num) cb++;
else if(ca==0) {
a=num;
ca=1;
}else if(cb==0) {
b=num;
cb=1;
}else{//num不为a和b,且a和b的数目都不为0,这样的次数<1/3
ca--;
cb--;
}
}
ca=0;
cb=0;
for (int num : nums) {
if (a == num) ca++;
else if (b == num) cb++;
}
if (ca > nums.length / 3) list.add(a);
if (cb > nums.length / 3) list.add(b);
return list;
}
}
//方法2