思路:
(1)位运算:169由于众数要求是大于n/2的话,因此,本题最多只有一个答案;则说明在不同位置上出现的二进制位数肯定是要求的答案,而不是非答案;
(2)摩尔投票法(从第一个数开始,count为0,就把这个数换成candidate;向后遍历遇到相同的就count+1,不同count-1。两数抵消后直接重新赋值)
//leetcode-169、位运算
int majorityElement(vector<int>& nums) {
if (nums.size() == 0) {
return 0;
}
if (nums.size() == 1) {
return nums[0];
}
int res = 0;
for (int i = 0;i < 32; i++) {
int count = 0;
for (int j = 0; j < nums.size(); j++) {
count += (nums[j] >> i & 1);
}
if (count > nums.size() / 2) {
res += 1 << i;
}
}
return res;
}
//leetcode-169、 摩尔投票法
int majorityElement(vector<int>& nums) {
if (nums.size() == 1) {
return nums[0];
}
int cand1 = nums[0];
int count1 = 1;
for (int i = 1; i < nums.size(); i++) {
if (cand1 == nums[i]) {
count1 += 1;
continue;
}
if (count1 == 0) {
count1 = 1;
cand1 = nums[i];
continue;
}
count1 -= 1;
}
return cand1;
}
vector<int> majorityElement(vector<int>& nums) {
if (nums.size() == 1) {
return nums;
}
if (nums.size() == 2) {
if (nums[0] != nums[1]) {
return nums;
}
vector<int> res;
res.push_back(nums[0]);
return res;
}
int cand1 = nums[0];
int count1 = 0;
int cand2 = nums[0];
int count2 = 0;
for (int i = 0; i < nums.size(); i++) {
if (nums[i] == cand1) {
count1 += 1;
continue;
}
if (nums[i] == cand2){
count2 += 1;
continue;
}
if (count1 == 0) {
cand1 = nums[i];
count1 += 1;
continue;
}
if (count2 == 0) {
cand2 = nums[i];
count2 += 1;
continue;
}
count1 -= 1, count2 -= 1;
}
count1 = 0, count2 = 0;
for (int i = 0; i < nums.size(); i++) {
if (nums[i] == cand1) {
count1 += 1;
}
if (nums[i] == cand2) {
count2 += 1;
}
}
vector<int> res;
if (count1 > nums.size() / 3) {
res.push_back(cand1);
}
if (count2 > nums.size() / 3 && cand2 != cand1) {
res.push_back(cand2);
}
return res;
}