【面试题】剑指Offer-29-找到出现次数超过一半的数字
来源:互联网 发布:mac系统编辑文档的软件 编辑:程序博客网 时间:2024/06/03 23:54
题目概述
解题思路
方法1
进行排序,排序后,超过一半次数的数字一定会出现数组的最中间的位置上
方法2
利用快排的思想,单次排序,会将数组分成两个区间
通过判断所分区间的中间元素是否为数组的中间值
来进行逐次划分求解
这里和快排很相似,就没有实现
时间复杂度为O(N)
方法3
巧妙思路
用两个变量,一个保存当前记录的数字,一个保存次数(初始化为0)
遍历一遍数组
如果数字与当前数保持相同,则次数加1
否则,次数减1
若次数减为0,则保存下一个位置的数字
时间复杂度O(N)
代码实现
方法1
//方法1:排序后取中间值//直接插入排序的思想//分成两个数组//第一个数组是有序的,第二个是无序的//开始的时候,只有第一个数在第一个数组//升序void InsertSort(int* arr, size_t n){for (int i = 1; i < n; ++i){int j = i - 1;int tmp = arr[i];for (; j >= 0; --j){//如果tmp比该位置大if (tmp > arr[j])break; arr[j + 1] = arr[j];}arr[j+1] = tmp;}}int MoreThanHalf1(int* arr, size_t n){InsertSort(arr, n);int midIndex = n >> 1;return arr[midIndex];}该算法的时间复杂度为O(N^2)
可以用其他排序,最快为O(N*logN)
方法3
//方法3//用快排,找中间的数//方法3//用技巧pair<bool,int> MoreThanHalf3(int* arr, size_t n){int num = arr[0];int count = 1;for (size_t i = 1; i < n; ++i){if (num == arr[i])count++;elsecount--; if (count == 0){if (i >= n - 1)return make_pair(false,0);num = arr[i + 1];}}return make_pair(true, num);}方法3中,注意判断传入数组有误的情况
用pair结构体,第一个元素表示数组是否符合题目要求
第二个元素表示最后返回的超过一半的数字
当然,如果第一个元素为FALSE,则第二个元素就不用关心了
1 0
- 剑指offer-面试题29 找到数组中出现次数超过一半的数字-1
- 【面试题】剑指Offer-29-找到出现次数超过一半的数字
- [剑指offer][面试题29]数组中出现次数超过一半的数字
- 剑指Offer:面试题29 数组中出现次数超过一半的数字
- 剑指offer 面试题29—数组中出现次数超过一半的数字
- 《剑指Offer》学习笔记--面试题29:数组中出现次数超过一半的数字
- 【剑指Offer学习】【面试题29 :数组中出现次数超过一半的数字】
- 剑指Offer面试题29(java版):数组中出现次数超过一半的数字
- 剑指offer面试题29-数组中出现次数超过一半的数字
- 剑指offer-面试题29:数组中出现次数超过一半的数字
- 剑指offer之面试题29:数组中出现次数超过一半的数字
- 剑指offer之面试题29数组中出现次数超过一半的数字
- 剑指Offer----面试题29:数组中出现次数超过一半的数字
- 剑指offer-----面试题29(数组中出现次数超过一半的数字)
- 剑指Offer面试题29:数组中出现次数超过一半的数字 Java实现
- 剑指offer面试题29:数组中出现次数超过一半的数字
- 剑指offer--面试题29:数组中出现次数超过一半的数字
- 剑指Offer面试题29(java版):数组中出现次数超过一半的数字
- android Context上下文详细了解以及使用
- 前端面试题
- 【寒江雪】软件测试方法
- android Activity.setContentView和Window PhoneWindow类学习
- 详解Java多线程
- 【面试题】剑指Offer-29-找到出现次数超过一半的数字
- android View的绘制过程学习
- android onMeasure测量过程中MeasureSpec学习
- 使用XStream java对象转换成XML遇到的问题
- springMVC+jpa+maven框架搭建
- android View中scrollTo以及 scrollBy方法学习
- windows7 64位下Python2.7安装MySQL驱动遇到的问题
- Java之Serializable/Externalizable序列化和反序列化
- angularJS-1:ng-repeat用法