数组中出现次数超过一半的数

本文介绍了一种在未排序数组中高效找出出现次数超过一半的数的方法,即众数。通过遍历数组并使用times变量跟踪当前候选众数的频率,该算法能在O(n)时间内完成任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


分析:

6//找出在一个数组中出现次数超过一半的数,可以这样理解,找一个数的中位数

  7 //基于这样思想最直观的做法是排序后找中间的数既可,但最好时间复杂度也得O(NlogN)
  8 //所以用一种简单的办法来解决
  9 //定义两个变量,从第一个数开始找,并记录第一个数为result为需要找的数,它出现的次数初始化为:times=1
 10 //以后只要找到和result相等的数rimes++,否则times--

 11 //当times等于0的时候,改变result等于当前指向的数,继续找

                                                                                                                     
  2 #include <iostream>
  3 #include <assert.h>
  4 using namespace std;
  5 
  6 //找出在一个数组中出现次数超过一半的数,可以这样理解,找一个数的中位数
  7 //基于这样思想最直观的做法是排序后找中间的数既可,但最好时间复杂度也得O(NlogN)
  8 //所以用一种简单的办法来解决
  9 //定义两个变量,从第一个数开始找,并记录第一个数为result为需要找的数,它出现的次数初始化为:times=1
 10 //以后只要找到和result相等的数rimes++,否则times--
 11 //当times等于0的时候,改变result等于当前指向的数,继续找
 12 int find(int *arr,int len)
 13 {
 14         assert(arr !=NULL);
 15         assert(len >0);
 16         int result=arr[0];
 17         int times=1;
 18         for(int i=1; i<len; ++i)
 19         {
 20                 if(times==0)
 21                 {
 22                         result=arr[i];
 23                         times=1;
 24                 }else if(result==arr[i])
 25                         times++;
 26                 else
 27                         times--;
 28         }
 29         return result;
 30 }
 31 int main()
 32 {
 33         int arr[]={1,2,3,2,2,2,5,4,2};
 34         //int arr[]={5,5,1,2,5,2,5,6,5};
 35         int len=sizeof(arr)/sizeof(*arr);
 36 
 37         int key=find(arr,len);
 38         cout<<"出现次数最多的数:"<<key<<endl;
 39         return 0;
 40 }                                                                                                                    
                        
                                              



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值