剑指offer面试题29:数组中出现次数超过一半的数字
2016-09-20 23:36
531 查看
题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
思路:参考任意第K大数字,排序后,数组中位的数一定是出现次数超过一般的数。O(n(1+1/2+….+1/2k))=O(n)。
思路:参考任意第K大数字,排序后,数组中位的数一定是出现次数超过一般的数。O(n(1+1/2+….+1/2k))=O(n)。
#include <iostream> #include <vector> using namespace std; int Partition(vector<int> &num, int length, int begin, int end) { if (num.empty() || length <= 0 || begin < 0 || end >= length) return -1; int index = begin; int small = begin - 1; while (index < end) { if (num[index] < num[end]) { ++small; int temp = num[index]; num[index] = num[small]; num[small] = temp; } ++index; } ++small; int temp = num[small]; num[small] = num[end]; num[end] = temp; return small; } int MoreThanHalf(vector<int> num, int length) { if (num.empty() || length <= 0) return -1; int middle = length >> 1; int begin = 0; int end = length - 1; int index = Partition(num, length, begin, end); while (index != middle) { if (index > middle) { end = index - 1; index = Partition(num, length, begin, end); } else { begin = index + 1; index = Partition(num, length, begin, end); } } int result = num[middle]; int times = 0; for (int i = 0; i < length; i 4000 ++) { if (result == num[i]) ++times; } if (length >= times * 2) result = -1; return result; } int main() { vector<int> num; int a; while (cin >> a) { num.push_back(a); } a = num.size(); int result = MoreThanHalf(num, a); cout << result << endl; return 0; }
相关文章推荐
- 一道面试题的解答_骑士获得金币问题
- 0062 玻璃珠从楼层上丢下找破碎临界楼层(腾讯笔试题)
- 剑指Offer面试题31:连续数组的最大和 Java实现
- java面试笔试资料 百度网盘
- 剑指Offer面试题32:从1到n整数中1出现的次数 Java实现
- 为什么程序员都是夜猫子?
- 剑指Offer面试题33:把数组排成最小的数 Java 实现,三种方法
- Android面试之Java引用类型简答
- 剑指Offer-【面试题02:实现Singleton 模式——七种实现方式】
- 面试总结
- SQL 面试经典问题 行列互相转化
- 数据库面试题目经典大全
- 牛客网面试算法题精讲第二季专题1
- 面试 Ibatis与mybatis区别
- 转载:java程序员如何拿到2万月薪
- Java线程面试题 Top 50 (转载)
- 职场人士如何减压-压力下工作的八个放松法则
- 职场人士如何减压-有效减压六大方法
- 今日面试题之【实现蛇形数组打印】
- Java多线程面试问题