方法一:map(28 ms)
class Solution {
public:
int majorityElement(vector<int>& nums) {
int ans=0;
map<int,int> counts;
for(int x:nums){
counts.insert(pair<int,int>(x,counts[x]++));
}
for(auto i=counts.begin();i!=counts.end();i++){
cout<<(i->first)<<":"<<(i->second)<<" ";
if(i->second>(nums.size()/2)){
ans=i->first;
}
}
return ans;
}
};
学到的:
1.map的添加元素方式:
m.insert(pair<int,int>(1,1));
我有一点搞不清楚的是,这个map的初始值是怎么确定的?为什么没有这个数,就可以直接++呢?
如何判断map是否包含某个值呢?看find函数返回的结果是否和end相等,若相等,则不包含。
if(res.find(i) == res.end()){
}
2.获得map元素的前或后:
i->first
i->second
3.map的遍历方式:使用迭代器
for(auto i=counts.begin();i!=counts.end();i++){
}
方法二:排序(根据题意可知,答案一定在中间)(24ms)
class Solution {
public:
int majorityElement(vector<int>& nums) {
sort(nums.begin(), nums.end());
return nums[nums.size()/2];
}
};
方法三:Boyer- Moore算法(20ms)
class Solution {
public:
int majorityElement(vector<int>& nums) {
int candidate = 0;
int count = 0;
for(auto x: nums){
if(count == 0) candidate = x;
if(candidate == x) count++;
else count--;
}
return candidate;
}
};
学到的:
方法四:栈
class Solution {
public:
int majorityElement(vector<int>& nums) {
stack<int> S;
for(int i = 0; i < nums.size(); i++){
if(S.empty() || nums[i] == S.top()) S.push(nums[i]);
else if(nums[i] != S.top()) S.pop();
}
return S.top();
}
};
方法五:分治
class Solution {
public:
int majorityElement(vector<int>& nums) {
return majority(nums, 0, nums.size() - 1);
}
private:
int majority(vector<int>& nums, int l, int r) {
if (l == r) {
return nums[l];
}
int m = l + (r - l) / 2, lm = majority(nums, l, m), rm = majority(nums, m + 1, r);
if (lm == rm) {
return lm;
}
return count(nums.begin() + l, nums.begin() + r + 1, lm) > count(nums.begin() + l, nums.begin() + r + 1, rm) ? lm : rm;
}
};
方法六:位操作
class Solution {
public:
int majorityElement(vector<int>& nums) {
int majority = 0;
for (unsigned int i = 0, mask = 1; i < 32; i++, mask <<= 1) {
int bits = 0;
for (int num : nums) {
if (num & mask) {
bits++;
}
}
if (bits > nums.size() / 2) {
majority |= mask;
}
}
return majority;
}
};