思路:
从头开始,如果遇到2个不同的数,就都删除,一直到最后,剩下的数就是出现次数大于n/2的。
可以推广到找出现次数大于n/k的情况,即遇到k个不同的数,删除,剩下的数就是出现次数大于n/k的。
时间复杂度O(N),空间复杂度:O(1)。
java code:
public class Solution {
public int majorityElement(int[] nums) {
int count = 0, candidate = 0;
for(int i = 0; i < nums.length; ++i) {
if(count == 0) {
candidate = nums[i];
count = 1;
}else {
if(candidate == nums[i]) {
count++;
}else {
count--;
}
if(count > nums.length / 2 + 1) return candidate;
}
}
return candidate;
}
}