Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋
times. The algorithm should run in linear time and in O(1) space.
找出数组中出现次数大于n/3的元素。
分析:
出现此处大于n/3的元素个数最多2个。遍历数组,用两个变量分别存储数组中出现次数最多的两个数num0、num1,然后再次遍历数组,统计num0,num1在数组中出现的次数(第1次遍历数组是无法通过O(1)空间复杂度统计出num0、num1出现的次数),即为cnt0、cnt1,分别判断cnt0、cnt1是否大于n/3即可。
程序如下所示:
class Solution {
public List<Integer> majorityElement(int[] nums) {
int len = nums.length;
List<Integer> list = new ArrayList<>();
if (len == 0){
return list;
}
int num0 = nums[0], num1 = nums[0];
int cnt0 = 0, cnt1 = 0;
for (int i = 0; i < len; ++ i){
if (nums[i] == num0){
cnt0 ++;
}
else if (nums[i] == num1){
cnt1 ++;
}
else if (cnt0 == 0){
num0 = nums[i];
cnt0 = 1;
}
else if (cnt1 == 0){
num1 = nums[i];
cnt1 = 1;
}
else {
cnt0 --;
cnt1 --;
}
}
cnt0 = 0;
cnt1 = 0;
for (int i = 0; i < len; ++ i){
if (nums[i] == num0){
cnt0 ++;
}
else if (nums[i] == num1){
cnt1 ++;
}
}
if (cnt0 > len/3){
list.add(num0);
}
if (cnt1 > len/3){
list.add(num1);
}
return list;
}
}