【LeetCode】169.Majority Element(多种解法总结)

方法一: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;
    }
};

学到的:

1.英文解释中文解释

方法四:栈

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;
    }
};

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值