打印数组中出现超过N/K的数字(复杂度O(n*k) 空间复杂度O(k))

先看一到入门题,这里k=2

剑指 Offer 39. 数组中出现次数超过一半的数字

难度简单34

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。

 

你可以假设数组是非空的,并且给定的数组总是存在多数元素。

 

示例 1:

输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]
输出: 2

解题思路:

对于一般的k=2,我们都知道需要有一个候选人,其实k>2我们只需要k-1个候选人即可。所以我们可以用k个桶做个hash,存放这k-1个候选人,桶容量够我们就放新的人进去,桶满了要插新的人的时候,我们就对所有的key-1. key == 0时候我们清掉这个key.

class Solution {
public:
    int majorityElement(vector& nums) {
        int n =nums.size();
        int k = 2;  //对于任意k 修改这里即可 剑指offer这里为k=2
        int bucket = k-1;
        map mm;
        for(auto it:nums){
            if(mm.size() mv;
                for(auto it2:mm){
                    mm[it2.first]--;
                    if(mm[it2.first]==0)mv.push_back(it2.first);
                }
                for(auto it2:mv)mm.erase(it2);
                if(mm.size() ret;
        for(auto it:mm){
            int no = it.first;
            int cnt=0;
            for(int i= 0;in/k)ret.push_back(it.first);
        }
        assert(ret.size());
        return ret[0];  //对于这道题返回的是第一个元素,对于一般的k返回ret
    }
};

你可能感兴趣的:(nowcoder,思维)