在数组中找到出现次数大于N/K的数

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wzc2608/article/details/81199813
#include <iostream>
#include <vector>
#include <map>
#include <list>
using namespace std;
void printHalf(vector<int>& arr)
{
    int cand = 0;
    int times = 0;
    for(int i = 0; i != arr.size(); ++i)
        if(times == 0)
    {
        cand = arr[i];
        times = 1;
    }
    else if(arr[i] == cand)
        ++times;
    else
        --times;

    times = 0;
    for(int i = 0; i != arr.size(); ++i)
        if(arr[i] == cand)
            ++times;

    if(times > arr.size() / 2)
        cout << cand << endl;
    else
        cout << "no such number" << endl;
}
map<int, int> getReals(vector<int>& arr, map<int, int>& cands)
{
    map<int, int> reals;
    for(int i = 0; i != arr.size(); ++i)
    {
        int curNum = arr[i];
        if(cands.find(curNum) != cands.end())
            if(reals.find(curNum) != reals.end())
                ++reals[curNum];
            else
                reals.insert(pair<int, int>(curNum, 1));
    }
    return reals;
}

void allCandMinusOne(map<int, int>& imap)
{
    vector<int> removelist;
    map<int, int>::iterator it;
    for(it = imap.begin(); it != imap.end(); ++it)
    {
        int key = it->first;
        int value = it->second;
        if(value == 1)
            removelist.push_back(key);
        else
            --imap[key];
    }
    for(int i = 0; i < removelist.size(); ++i)
        imap.erase(removelist[i]);
}

void printmajor(vector<int> & arr, int k)
{
    if(k < 2)
    {
        cout << " k is invalid" << endl;
        return;
    }
    map<int, int> cands;
    for(int i = 0; i < arr.size(); ++i)
    {
        if(cands.find(arr[i]) != cands.end())
            ++cands[arr[i]];
        else
        {
            if(cands.size() == k - 1)
                allCandMinusOne(cands);
            else
                cands[arr[i]] = 1;
        }
    }

    map<int, int> reals = getReals(arr, cands);
    map<int, int>::iterator it = reals.begin();
    bool flag = false;
    for(; it != reals.end(); ++it)
    {
        int key = it->first;
        if(reals[key] > arr.size() / k)
        {
            flag = true;
            cout << key << " ";
        }
    }
    cout << (flag ? "" : "no much number") << endl;
}
int main()
{
    int a[] = {1, 2, 3, 4, 1, 1, 2, 1, 1, 5, 1, 1, 2, 1};
    vector<int> ivec(a, a + 14);
    printHalf(ivec);
    printmajor(ivec, 7);
}

猜你喜欢

转载自blog.csdn.net/wzc2608/article/details/81199813