zoukankan      html  css  js  c++  java
  • LintCode "Majority Number III"

    Based on Bucketing and "Majority Number I".

    class Solution {
        pair<int,int> majorityNumber0(vector<int> &num) {
            int count = 0;
            int ret = 0;
            for(int i = 0; i < num.size(); i ++)
            {
                if (count == 0)
                {
                    ret = num[i];
                    count = 1;
                    continue;
                }
                if(ret != num[i]) count --;
                else if(ret == num[i]) count ++;
            }
            // find count
            int cnt = 0;
            for(auto v: num)
                if(v == ret) cnt ++;
            return make_pair(ret, cnt);
        }
    public:
        /**
         * @param nums: A list of integers
         * @param k: As described
         * @return: The majority number
         */
        int majorityNumber(vector<int> nums, int k) 
        {
            int n = nums.size();
            
            auto mm = minmax_element(nums.begin(), nums.end());
            int minv = *mm.first, maxv = *mm.second;
    
            int dist = ((maxv - minv) / k) + 1;
    
            vector<pair<int, vector<int>>> bkt(k + 1, make_pair(0, vector<int>()));
            for(auto v: nums)
            {
                int inx = (v - minv) / dist;            
                bkt[inx].first ++;
                bkt[inx].second.push_back(v);
            }
    
            int tgt = n / k;
            for(auto &p : bkt)
            {
                if(p.first > tgt)
                {
                    auto rp = majorityNumber0(p.second);
                    if(rp.second > tgt)
                    {
                        return rp.first;
                    }
                }
            }
            return 0;
        }
    };

    And yes, the majorityNumber0() call can be inlined in the pass 1. That will make it O(k) space. One solution online with hashmap is very similar with the bucketing idea here.

  • 相关阅读:
    [HNOI2008]玩具装箱TOY
    [洛谷P3628] [APIO2010]特别行动队
    [洛谷P2698] [USACO12MAR]花盆Flowerpot
    [SCOI2010]股票交易
    [洛谷P3957] 跳房子
    [洛谷P1822] 魔法指纹
    [NOI2003] 文本编辑器
    平衡树小结
    C++异常处理
    常用颜色的RGB值
  • 原文地址:https://www.cnblogs.com/tonix/p/4916201.html
Copyright © 2011-2022 走看看