分治法-数组中出现次数超过一半的数字
2016-07-10 11:05
411 查看
题目描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
算法1:
排序后,如果存在解,那么在最中间的数字是出现次数超过一半的数字。
算法2:
不排序,使用partition,每次都如快速排序一样,判断每一个数字是不是在partition后处于中间位置与否,如果处于则为所求。最后要判断数字有没有超过一半次数
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
算法1:
排序后,如果存在解,那么在最中间的数字是出现次数超过一半的数字。
算法2:
不排序,使用partition,每次都如快速排序一样,判断每一个数字是不是在partition后处于中间位置与否,如果处于则为所求。最后要判断数字有没有超过一半次数
class Solution { public: //分区,找到每次的第一个数字排序后的最终位置 int Partition(vector<int> &numbers,int start,int end){ int key = numbers[start]; int i = start; int j = end; while (i < j){ while (i < j && numbers[j] > key){ j--; } if(i < j) numbers[i++] = numbers[j]; while (i<j && numbers[i] < key) i++; if(i < j) numbers[j--] = numbers[i]; } numbers[i] = key; return i; } //检查在中间位置的数出现次数是否超过一半 bool ChechHalf(int number,vector<int>numbers){ int count = 0; int half =(int)numbers.size() / 2; for (int i = 0; i < numbers.size(); ++i) { if(numbers[i] == number) count++; } return count > half; } int MoreThanHalfNum_Solution(vector<int> numbers) { if(numbers.size() == 0) return 0; //出现次数大于数组一半,该数字肯定是排好序的中间位置. int start = 0; int end = (int)numbers.size() - 1; int middle = (start + end + 1) / 2; int index = Partition(numbers,start,end); while (index != middle){ //数字在后半部分,则往前找 if(index > middle){ end = index - 1; index = Partition(numbers,start,end); } //数字在前半部分,则往后找 else{ start = index + 1; index = Partition(numbers,start,end); } } if(index == middle && ChechHalf(numbers[index],numbers)) return numbers[index]; else return 0; } };
相关文章推荐
- ruby 数组使用教程
- Ruby中的数组和散列表的使用详解
- C#实现AddRange为数组添加多个元素的方法
- C#比较二个数组并找出相同或不同元素的方法
- C#动态调整数组大小的方法
- 详解Lua中的数组概念知识
- Perl中的列表和数组学习笔记
- 探索PowerShell (八) 数组、哈希表(附:复制粘贴技巧)
- C#中数组初始化与数组元素复制的方法
- C#交错数组用法实例
- Linux Shell 数组建立及使用技巧
- PowerShell数组的一些操作技巧
- C#通过yield实现数组全排列的方法
- C#不重复输出一个数组中所有元素的方法
- C#实现将数组内元素打乱顺序的方法
- C#中用foreach语句遍历数组及将数组作为参数的用法
- 详解C#编程中一维数组与多维数组的使用
- Ruby简明教程之数组和Hash介绍
- 深入解析C#中的交错数组与隐式类型的数组
- C语言查找数组里数字重复次数的方法