寻找出现次数超过一半的数
1、摩尔投票法
// 超过n/3
public List<Integer> majorityElement(int[] nums) {
List<Integer> res = new ArrayList<>();
int c1 = 0, c2 = 0;
int count1 = 0, count2 = 0;
for (int i : nums) {
if (c1 == i) {
count1++;
} else if (c2 == i) {
count2++;
} else if (count2 == 0) {
c2 = i;
count2 = 1;
} else if (count1 == 0) {
c1 = i;
count1 = 1;
} else {
count1--;
count2--;
}
}
count1 = count2 = 0;
for (int i : nums) {
if (i == c1) {
count1++;
} else if (i == c2) {
count2++;
}
}
if (count1 > nums.length / 3) {
res.add(c1);
}
if (count2 > nums.length / 3) {
res.add(c2);
}
return res;
}
2、位运算法
public int findMajority(int[] nums) {
int[] bits = new int[32];
int res = 0;
for(int i :nums) {
int mask = 0x1;
for(int j = 0;j<32;j++) {
bits[j] += (i&mask)>>j;
mask <<= 1;
}
}
for(int i=0;i<32;i++) {
if (bits[i]>nums.length/2) {
res += 1<<i;
}
}
return res;
}