添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

最经典的题目莫过于是: 在一个数组中找出出现次数 超过n/2 的元素?更进一步的,找出数组中出现次数 大于n/3 的所有元素?

注:这里有一个很重要的事实,那就是出现次数大于n/m的元素的个数至多为(m-1)个,比如出现次数大于n/3的至多只有两个。

关于这一类题目的解题思路,可以先讲一个游戏 称作 “俄罗斯方块”。这里的规则是每一行的元素要完全不一样,一样的元素则总是在同一列,如果最下面的行已经被填满,那么消除最下面的行。

例如在数组 A = {7,3,3,7,4,3,4,7,3,4,3,4,7,3,4} Len = 15,现在找出现次数大于 Len/3的,也就是出现超过5次的。那么现在我们的方块的宽度就应该是3,即每一步的状态一次为

3                 7 3

7      7  3        7 3                 7 3 4     //现在消去最下面的一行 。               。。。。

知道没有元素可添加,并且没有元素可删除时,方块中最后还剩下的元素就有可能是大于n/m的,最后再检验一遍即可。

typedef pair<int,int> P;
vector<int>  printMaxTwo(const vector<int> &A , const int k)
    typedef map<int,int>::value_type Elem;
    const int n = A.size();
    map<int,int> idxs;
    for(int i=0;i<n;++i)
        if(idxs.find(A[i]) != idxs.end())
            ++idxs[A[i]];
            idxs.insert(Elem(A[i],1));
            if(idxs.size() == k)
                //if there is a full level in the box
                for(auto iter = idxs.begin(); iter != idxs.end();)
                    --((*iter).second);
                    if((*iter).second == 0) iter = idxs.erase(iter);
                    else ++iter;
    //If there exists no element in the final box
    vector<int> ret;
    for(auto a: idxs) a.second = 0;
    for(auto a: A)
        if(idxs.find(a) != idxs.end())
            ++idxs[a];
    for(auto a: idxs)
        if(a.second >= n/k) ret.push_back(a.first);
    return ret;
值得一提的是,上述代码中,如果最终的hash表内没有元素,并不能说明没有元素出现n/m次,为什么呢,比如,元素的个数是15,其中有2,3,5,三个元素每个出现5次,那么这并不能说明出现此处大于或等于n/m的没有,而是有3个。

但是一般需要求的是大于n/m的,上述情况也只有在整除时才会出现,那么可以忽略上述情况了。

问题描述:在一个大小为n的数组中,其中有一个数出现的次数超过n/2,求出这个数。这题看似很简单,但是找到最优解不容易,一般情况我们首先想到最笨的方法,每选一个数,遍历一次数组,复杂度O(N^2),或者... 来自: a7980718的专栏 【题目】给定一个整型数组arr,再给定一个整数k,打印所有出现次数大于N/K的数。如果没有这样的数,打印提示信息。【要求】时间复杂度为O(N*K),额外空间复杂度为O(K)。【思路】每次从数组中删除K... 来自: 有图有真相 数组中出现次数超过一半(可实现时间复杂度o(n),空间复杂度o(1))的进阶版鸽巢原理:出现次数大于N/K的元素的个数至多为(M-1)个思路:每次从数组中删除k个不同的元素,直到不能再删了为止。那么最... 来自: Neo_dot的博客 Designanalgorithmthat,givenalistofnelementsinanarray,findsalltheelementsthatappearmorethann/3timesin... 来自: f81892461的专栏 MajorityElement原题链接MajorityElement给定一个数组,元素个数为n,找出出现次数大于n/2的那个元素摩尔投票法思想每次从数组中选择两个不相等的元素进行相互抵消(删除),最后... 来自: 一个程序渣渣的小后院 1、找出数组中出现次数超过一半的元素intmajorityElement(constvector&nums){ intm; intcount=0; for(autonum:nums){ if(0==... 来自: 蓝旭晨枫╮ 这道题目的思路其实很简单,与在数组中找出现次数大于1/2的元素经典算法非常类似,O(n)的时间复杂度。定义出现频率大于1/4的数为频繁项,这样的频繁项最多有3个。算法的核心思想很简单,每次删去不同的4... 来自: liuintermilan的专栏 #include&amp;lt;iostream&amp;gt;#include&amp;lt;vector&amp;gt;#include&amp;lt;map&amp;gt;#include&am... 来自: wzc2608的博客 首先要知道n长度中出现次数超过3/n的元素不会超过两个,所以设置两个存储结果的变量,再对这两个指针分别设置两个int变量然后往数组后面依次走,如果有一样的则在那个元素的int变量+1,如果都不存在则两... 来自: ice_time1的博客 算法--找出数组中出现次数超过一半的数    每当我看到经典的算法题,就怀念高中,感觉很多算法题就是高中的题目,谁叫哥只读了个专科,高数基本相当没学。    有空要看看高数啊,想当年数学那是相当的..... 来自: xyjikl importjava.util.HashMap;importjava.util.LinkedList;importjava.util.List;importjava.util.Map.Entry;/*... 来自: NerveMore 左神的代码写的很好,时间复杂度是O(N*K),额外空间复杂度O(K),用map集合保存K个不同的值。一、如果map的大小不超过K,遍历到相同的,value加1,不同的,添加进去。用map.contai... 来自: qq_31617121的博客 给你一个数组nums,如何找nums中出现次数超过总数的1/3的数,要求时间复杂度O(N)和空间复杂度O(1)。我觉得这不算是一道算法题,更像是一道智力题。接下来我先说下这道题怎么做,再谈谈我对此类题... 来自: xindoo 时间O(n),空间O(1)LeetCode169.找出数组中出现次数超过n/2次的数http://blog.csdn.net/chfe007/article/details/42919017基本原理:... 来自: linyacool的博客 本文是对一篇英文论文的总结:FindingRepeatedElements。想看原文,请Google之。这个问题的简单形式是“查找出现次数大于n/2的重复元素”。我们先从简单问题开始,然后再做扩展。1... 来自: mdj67887500的专栏 好未来:n个数里出现次数大于等于n/2的数题目描述输入n个整数,输出出现次数大于等于数组长度一半的数。输入描述:每个测试输入包含n个空格分割的n个整数,n不超过100,其中有一个整数出现次数大于等于n... 来自: 两鬓已不能斑白的专栏 题目:如何在O(n)的时间复杂度内找出数组中出现次数超过了一半的数。由于本题对时间复杂度有要求,所以可采用以下2种方法。方法一:每次取出两个不同的数,剩下的数字中重复出现的数字肯定比其他数字多,将规模... 来自: 小僧Coding 求数组中多于一半的或者是多于1/3的全部数字都可以用这种方法解决这里给你一个数组,要你求出所有出现数量多于 ⌊n/3⌋的数字,这题方法简单,但是原理非常复杂,,首先用两个数a,b,n1,n2来分别记录... 来自: u012737193的博客 一、参考剑指offer的思路如果数组中出现大于1/2的数,如果按顺序排列,这个数肯定出现在下标为N/2的数上,所以这里参考Top-K问题,用快速排序原理求得第N/2大的值,然后判断该值的数量有没有大于... 来自: qq_31617121的博客 解析:该题目可以用mapreduce的wordcount思想做,就是存储键、值对,键存数字,值存该数字出现的次数,当然需要用一个变量记住出现次数超过一半的数了,说完了,开始撸起袖子干了。publics... 来自: wickedvalley 先讨论超过数组长度一半的情况超过数组长度一半意味着这个数字的个数大于其他全部数字个数之和,算法大致为,首先设置两个参数currentAxis,currentNum。参数currentAxis用来记录当... 来自: wang_cheng_hei的专栏 继续前一篇文章...相对于前一篇文章讲的算法来说,“多重集算法”比较容易理解。我们把原始数组看成一个多重集,每次从数组中删除k个不同的元素,直到不能再删了为止。那么最后数组中剩余的元素就是候选元素。例... 来自: mdj67887500的专栏    数组中所有的元素都出现N次,只有一个出现M次,请这个出现M次的元素。这种类似问题在面试中经常会问到,下面总结一下相关题目,这种问题大多数情况下都是使用位运算来解题。题目一: 一个数组中所有元素都... 来自: weixin_43820398的博客 /*acceptthearguments&soddem05=[responseEnteryourdemoddem05]&sodlu05=[responseenteryourluodlu05]&sFC=... 来自: freegodlee的专栏 现在有一个数组,已知一个数出现的次数超过了一半,请用O(n)的复杂度的算法找出这个数。分析:设数A出现次数超过一半。每次删除两个不同的数,在剩余的数中,数A出现的次数仍超过一半。通过重复这个过程,求出... 来自: kiwi's garden 前言其实说起初衷,是之前吾辈的学校开展了个数模比赛,我去帮别人当帮手,当时的B题是基因拼接,D题是污染程度评定作为ACMer,我当然喜欢B题这种像ACM竞赛题一样感觉的东西,但无奈人家才是参(da)赛... 来自: CD's Coding 【题目】  给定一个整型数组arr,打印其中出现次数大于一半的数,如果没有这样的数,打印提示信息。要求时间复杂度为O(N),空间复杂度为O(1)。【进阶】  给定一个整型数组arr,再给定一个整型K,... 来自: 冰殇的博客 寻找长度为n数组中出现次数超过n/2的元素。    可以暴力枚举时间复杂度为O(n^2),可以排个序然后处理时间复杂度为O(n*lon(n)),主要花在排序上。    在元素较小的情况下可以哈希处理,... 来自: 晓风残月xj 原题:已知数组中有三个数超过了数组长度的1/4,请找出这三个数。//ConsoleApplication6.cpp:定义控制台应用程序的入口点。//找出数组中出现1/4的三个数#include"std... 来自: zhangchuan的博客 classSolution{public:/**@paramnums:alistofintegers*@return:Themajoritynumberthatoccursmorethan1/3*/i... 来自: 小强的博客 这个字数超过n/2,那么采用一种简单的方法就是如果该数把所有的都抵消掉,最后剩下的那个一定是这个超过n/2的数,所以遍历一遍就可以了。设定抵消值为$key,$key的个数设置为$num=1,向后遍历,... 来自: less_cold的博客 数组中出现次数超过一半的数字来自剑指offer,其中两种方法思想都很好,感谢作者。#includeusingnamespacestd;/*两种思想:第一种想到统计上的中位数定义如果存在满足条件的数,则... 来自: huruzun的专栏 出现次数超过一半的数题目描述数组中有一个数出现的次数超过了数组长度的一半,找出这个数。分析与解法因为不确定给定的数组是无序还是有序的,所以要分情况讨论。解法一:排序如果给定的数组是无序的,那么可以先对... 来自: 咸鱼 题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现5次,超过数组长度的一半,因此输出2.... 来自: D.K专栏 数据结构与算法分析——c语言描述练习2.19答案这道题网上找的答案然后自己写一遍。参考了阿飞旭日东升的代码这道题的算法为什么数组B的候选元也是A的候选元呢?我不知道怎么数学证明。以下只是个人吹水,如果... 来自: wwj /*N个元素的数组中找出出现多于N/2次的数(主元素)问题一:如何构造一个数组,此数组中有数字出现多于N/2次?随机生成一个数,将此数随机插入N/2+1次到数组中,其它空位再用随机生成数来填充问题二:... 来自: sure-fire的专栏 怎样找出一个序列中出现次数最多的元素呢?1:超极简单的方法fromcollectionsimportCounterwords=['look','into','my','eyes','look','in... 来自: xie_0723的博客 给定一个大小为n的数组,找到其中的众数。众数是指在数组中出现次数大于⌊n/2⌋的元素。你可以假设数组是非空的,并且给定的数组总是存在众数。示例1:输入:[3,2,3]输出:3示例2:输入:[2,2,1... 来自: 阿巴卡的博客 现在有一个整数数组,已知一个数出现的次数超过了一半,请用O(n)的复杂度的算法找出这个数。 算法:充分利用出现次数超过一半这个特点,使用两个变量candidate和vote,分别代表候选人和票数,遍历... 来自: The time is passing 一、问题描述出自数据结构与算法分析的第二章习题中,共有四问。题干:大小为N的数组,其主元素是一个出现超过N/2的元素。首先找出主元素的一个候选元,第二步确认该候选元是否为主元素。为找出数组A中的候选元... 来自: 晓风残月龙 对于大家都能想到的空间换时间这种想法不再赘述,这种方法对于数量级较小还可起效,但对于数据范围大的话无法保证。接下来浅谈一下我的想法——先排序,再统计。由于初学ACM,无法保证算法的高效,只代表我的拙见... 来自: XA1976950963的博客 题目要求如下:令A是一个长度为n的正整数序列。试设计一个时间和空间复杂度分别为O(n)和O(1)的算法,判断A中是否存在这样的元素x,x在序列中出现次数超过n/3。若存在这样的x,则将其输出。实现思路... 来自: weixin_41106545的博客 题意如标题所说。注意,默认此数组中有元素的出现次数为len/2。刚开始看到这道题,觉得简单到爆。直接sort一遍再取len/2处的元素不就行了嘛。这样的时间复杂度为nlogn。后来看了下面这种别人的做... 来自: ZZURingo的博客 题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字,否则返回0。比如长度为9的数组{1,2,3,2,2,2,5,4,2},数组中2出现了5次,超过数组长度的一半,因此输出2。方法1:因... 来自: Cheng_913的博客 之前参加HAUT周赛内存限制4mb用数组不通过,怎么办?众数出现的次数必须大于n/2第一行输入一个整数n(1&amp;lt;=n&amp;lt;=1E6)接下来一行n个整数mi(1&amp;lt;=M... 来自: jym蒟蒻 思路:数组中有一个数字出现的次数超过数组长度的一半,也就是说它出现的次数比其他所有数字出现次数的和还要多。因此我们可以考虑在遍历数组的时候保存两个值:一个是数组中的一个数字,一个是次数。当我们遍历到下... 来自: nwpu_geeker的博客 这个问题以前在书上碰到过,书上采取的办法是从相邻的两个数开始挑选,保证该元素一定会进入下一次的候选集合,且仍然满足出现次数超过一半,具体实现采用的C++.这一次我重新想了一个办法,利用分治算法递归的去... 来自: pyb的博客 很多人拿到这道题就会想到利用一个计数器count,记录第一个元素value,将count=1;如果遍历数组遇到和value相等的count++,否则count–;intfind(int*a,intn)... 来自: 落叶知秋深的博客 一、概述最近在springboot项目引入thymeleaf模板时,使用非严格标签时,运行会报错。默认thymeleaf模板对html5标签是严格检查的。二、在项目中加NekoHTML库在Maven中... 来自: Luck_ZZ的博客 在一个servlet的请求中,响应的方式的通常有四式,response.getWriter(),response.getOutputStream(), request.getRequestDispa... 来自: 蜗牛学习笔记 在多视角几何中,特别是在一些恢复相机运动轨迹的模型中,我们需要将相机的旋转和平移表示出来。通常情况下,我们都是在欧几里得空间中用R和t来进行相应的运算得到相机轨迹。然而,在很多论文中,作者们却喜欢用L... 来自: 知行合一 #include using namespace std;#define M 5#define N 4int a[M][N] = {0,1,0,1,0,1,1,0,1,1,0,0,1,0,1,0,1,... 来自: miracle的专栏 问题场景描述整个项目通过Maven构建,大致结构如下: 核心Spring框架一个module spring-boot-base service和dao一个module server-core 提供系统... 来自: 开发随笔 在开发软件时,碰到了有一大批的dll需要加载,且这些dll中有隐式链接到其它dll情况.由于某些原因,不能将dll放入系统目录中也不能将他们放置在应用程序同一目录中. 为集中管理,将其放置到应用程序... 来自: nscboy的专栏 jiesi008:为何不对啊? vector<int> nums = { 1, 2, 2, 3, 3, 3, 4, 4, 4, 4 }; vector<int> result3 = printMaxTwo(nums, 5); for(auto n : result3) cout << n << endl; 应该输出 3,4。你的程序输出1.2.3.4

C++之 模板化基类 的名称处理 fly_flly:现在的vs编译器已经能深入的基类模板内部去寻找定义了,都可以正常编译。 文章中的代码: template<> class MsgSender<CompanyC> 已经实现了CompanyC的特化,所以 Log() 函数中的 sendClear() 不会报错。当定义 LogSendMsg<CompanyC> sendC 后,sendC.Log()中的 sendClear() 就会调用特化代码

C++之 模板化基类 的名称处理 y824448940:第一个例子在VS2012中可以编译通过啊

C++ 标准库值操作迭代器的常见函数 aqu123123:输出时,prev、next前面需要加*,函数本身返回的是迭代器,cout不能直接输出迭代器的值。