数组中出现次数超过一半的数
2016-06-17 21:16
141 查看
分析:
6//找出在一个数组中出现次数超过一半的数,可以这样理解,找一个数的中位数
7 //基于这样思想最直观的做法是排序后找中间的数既可,但最好时间复杂度也得O(NlogN)
8 //所以用一种简单的办法来解决
9 //定义两个变量,从第一个数开始找,并记录第一个数为result为需要找的数,它出现的次数初始化为:times=1
10 //以后只要找到和result相等的数rimes++,否则times--
11 //当times等于0的时候,改变result等于当前指向的数,继续找
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 }
相关文章推荐
- android Studio 的ADB使用配置
- 闭包
- java学习笔记之自定义注解
- Java多线程——安全与死锁问题
- latex 不换行
- cs231学习笔记一 图像识别与KNN
- MIPI CSI-2规范(一)——概述及层级
- PYTHON-基础-时间日期处理小结
- Android中获取布局中的布局(获取子布局方法)
- 周末作业
- C++ - PAT - 1047. 编程团体赛(20)
- 机器学习(周志华版)读书笔记1
- 300 Longest Increasing Subsequence
- 补C++ 4
- linux---谈谈vfork和fork的区别及exit与return
- 专题四1005
- hdu 1021 Fibonacci Again(斐波那契数列,取余)
- BZOJ3524 [Poi2014]Couriers
- IOS中定时器NSTimer的开启与关闭
- Leetcode 62. Unique Paths