BoP——2.3水王问题寻找出现次数超过某数的数

总体来说就是在一堆的数中,有某个数出现的次数超过了总数的一半或者1/3,1/4。

方法一

先排序,然后,遍历一遍找就行了。
但是面试中不是最终方法。

方法二

既然超过了一半,那么我们就每次从数组中删除两个不同的数,最后剩下的一定都是一样的了。
编程之美数上的代码,并不是真正意义上的删除,而是跳过两个不同的数。

int findTarget(vector<int> source)
{
    int target ;
    int counts=0;
    for(int i = 0;i<source.size();i++)
    {
        if(counts ==0)
        {
            target = source[i];
        }else{
            if(target  == source[i])
            {
                counts++;
            }else{
                counts--;
            }
        }
    }
    return counts;
}

代码解释

counts==0时表示需要更换target了。当目前的target等于遍历到容器中的元素,那么表示出现相同的数,然后counts++,如果不同就--,当不同时,--就表示“删除”了一对不同的数据。当counts==0时,表示target代表的数也应该被删除,然后再赋予另一个值。

很奇妙的方法!

方法三

使用map或者是散列表

int findTarget3(vector<int> source)
{
    map<int,int> memo;
    for(int i:source)
    {
        memo[i]++;
    }

    for(map<int,int>::iterator it = memo.begin();it != memo.end();it++)
    {
        if(it->second >source.size()/2)
        {
            return it->first;
        }
    }
    return -1;  
}

方法四

快拍的思想,因为时超过一般的数一样,所以,如果排序以后,中点的数就是我们需要的。
所以使用快排,如果分割元素的下标是中点,那么该元素就是所求,否则,就去包含中点的那一半。

但是,当该数出现次数为1/4的时候,还是需要使用map吧。如果采用删除数的方式,那么需要更改原来的数组,或者添加一个memo,那么还不如直接使用map

意外收获

clang不支持

vector<int>  i{1,2,3,4};

回报错。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 14,348评论 0 33
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,306评论 19 139
  • 今天开会,老板正儿八经地论述了一番关于自己人的概念,意思是说,自己不把自己当作一个集体的人,那就别怪别人不把你当自...
    amy430阅读 1,066评论 0 0
  • 世界不会偏向任何一人。 拥有巨大成就的人,就得历经那暗无天日的时光,或是别人的冷嘲热讽,或是孤掌难鸣的坚持。 贪图...
    南城丶往事阅读 3,493评论 0 1
  • 大寒风中现,开轩溢清寒。 今朝又天涯,何日是归年。 2017.1.20
    梅十九阅读 988评论 0 1