分析:
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 }