第二十一章:数组中超过出现次数超过一半的数字

来源:互联网 发布:天猫淘宝平板电脑套 编辑:程序博客网 时间:2024/06/08 08:03

第二十一章数组中出现次数超过一半的数字

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


//题目:数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字。 #include <iostream>  #include <vector>#include <hash_map>    using namespace std;   //第一种方法//hash法,时间O(n),空间O(n)int Find(int *a,int N){hash_map<int,int> hm;int candidate;int maxTimes=INT_MIN;for(int i=0;i<N;i++){hm[a[i]]++;if(hm[a[i]]>maxTimes){maxTimes=hm[a[i]];candidate=a[i];}}return candidate;}//第二种方法//统计法,时间O(n),空间O(1)int Find2(int *a, int N)  //a代表数组,N代表数组长度  {      int candidate;      int nTimes, i;      for(i = nTimes = 0; i < N; i++)      {          if(nTimes == 0)          {              candidate = a[i], nTimes = 1;          }          else          {              if(candidate == a[i])                  nTimes++;              else                  nTimes--;          }      }      return candidate;   }  //第三种方法//删除法,因为涉及到删除,数组不好操作,所以用容器处理int Find3(int *a,int N)  //a代表数组,N代表数组长度  {  vector<int> num(a,a+N);for(auto it=num.begin();it!=num.end();){auto n=next(it);for(;n!=num.end()&&n==it;++n);if(n==num.end())break;num.erase(n);it=num.erase(it);}return *num.begin();}  int main()  {  int a[]={4,5,6,5,5,4,7,5,5};cout<<Find3(a,sizeof(a)/sizeof(int))<<endl;}  

加强版水王:找出出现次数刚好是一半的数字


//题目:找出出现次数刚好是一半的数字 #include <iostream>  #include <vector>#include <hash_map>    using namespace std;   //第一种方法//统计法,时间O(n),空间O(1)//将不看数组的最后一个元素,先将问题转化成了超过一半的数处理//最后一个元素无外乎两种情况,一种是最后一个元素不是这等于一半的数,那就不予考虑,以上得出的即是答案//最后一个元素即是这等于一半的数,上面得出的就不一定是解,那就统计该元素出现的次数int Find(int *a, int N)  //a代表数组,N代表数组长度  {      int candidate;      int nTimes, i;      for(i = nTimes = 0; i < N; i++)      {          if(nTimes == 0)          {              candidate = a[i], nTimes = 1;          }          else          {              if(candidate == a[i])                  nTimes++;              else                  nTimes--;          }      }  int cnt=0;for(int i=0;i<N;i++)if(a[i]==candidate)cnt++;    return cnt==N/2?candidate:a[N-1];   } //第二种方法//两个变量记录法int Find2(int *a,int N){int candidate1,candidate2;      int nTimes1, nTimes2, i;                for(i = nTimes1 = nTimes2 =0; i < N; i++)      {          if(nTimes1 == 0)          {              candidate1 = a[i], nTimes1 = 1;          }          else if(nTimes2 == 0 && candidate1 != a[i])          //注意:这里的判断条件加上第二个变量是否等于第一个变量的判断          {                            candidate2 = a[i], nTimes2 = 1;          }          else          {              if(candidate1 == a[i])                  nTimes1++;              else if(candidate2 == a[i])                  nTimes2++;              else              {                  nTimes1--;                  nTimes2--;              }          }      }      return nTimes1>nTimes2?candidate1:candidate2;}int main()  {  int a[]={7,5,6,5,5,7,7,5};cout<<Find2(a,sizeof(a)/sizeof(int))<<endl;}  




0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 1周岁吐奶有酸味怎么办 十多天的宝宝吐奶怎么办 未满月婴儿吐奶怎么办 2个月宝宝溢奶怎么办 四岁宝宝说话结巴怎么办 小孩说话结巴打顿怎么办 2岁宝宝突然说话结巴怎么办 2岁宝宝突然结巴怎么办 幼儿舌头起泡牙龈出血怎么办 小孩长得太快怎么办 脑出血压着神经不会说话怎么办 四岁宝宝说话有点口吃怎么办 三岁宝宝有点口吃怎么办 3岁宝宝有点口吃怎么办 三岁宝宝说话有点口吃怎么办 六岁说话重复第一个字怎么办 宝贝烧到39.5度怎么办 宝贝39度不退烧怎么办 两岁多小儿突然变得口吃怎么办 百度两周岁宝宝口吃怎么办 2岁宝宝偶尔结巴怎么办 两岁宝宝说话磕巴怎么办 宝宝两岁结巴了怎么办 人多说话就紧张怎么办 小孩拉尿不叫人怎么办 2岁宝宝说话有点结巴怎么办 两岁半的宝宝说话结巴怎么办 2个月宝宝怕洗澡怎么办 2岁宝宝不喜欢喝奶粉怎么办 宝宝断奶不喜欢喝奶粉怎么办 宝宝不喜欢奶粉的味道怎么办 四个月宝宝不喜欢吃奶粉怎么办 四岁宝宝有口臭怎么办 4个月宝宝口臭怎么办 2岁宝宝有口臭是怎么办 两岁宝宝有口气怎么办 2岁宝宝口气重是什么原因怎么办 两岁宝宝口气重怎么办 两岁宝宝有口臭怎么办 两岁身高不达标怎么办 两岁宝宝82厘米怎么办