数组中出现次数超过一半的数字
2016-09-07 15:11
120 查看
题目描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。Java代码实现
import java.util.Random; //如果一个数字出现的次数超过数组长度的一半,那么按照顺序排列,位于中位数上的元素一定是该数字。所以 //这题就可以转换成一个求中位数,利用快排划分的思想可以实现算法复杂度为O(n)。 //如果直接排序,算法复杂度最少是O(NlogN) public class MoreThanHalfNum { public static void main(String[] args){ int[] a = {1,2,3,2,2,2,5,4,2}; System.out.println(moreThanHalfNum(a)); } public static int moreThanHalfNum(int[] array){ if(array == null) return 0; int len = array.length; int middle = len >> 1; //取得中间位置的下标 int start = 0; int end = len - 1; int index = Partition(array, start, end); while(index != middle){ if(index > middle) { end = index - 1; index = Partition(array, start, end); } else { start = index + 1; index = Partition(array, start, end); } } int result = array[middle]; if(!CheckMoreThanHalf(array, result)) return 0; return result; } //检查位于中间位置的元素的个数是否超过数组长度的一半 public static boolean CheckMoreThanHalf(int[] array, int result){ int count = 0; for(int i = 0; i < array.length; i++){ if(array[i] == result) count++; } if( (count*2) <= array.length) return false; return true; } //快排的 划分函数 public static int Partition(int[] array, int start, int end){ if(array == null) return 0; Random rand = new Random(); int index = rand.nextInt(end - start +1) + start; swap(array, index, end); int small = start - 1; for(index = start; index < end; ++index) { if(array[index] < array[end]) { ++small; if(small != index) { swap(array, small, index); } } } ++small; swap(array, small, end); return small; } public static void swap(int[] arr, int x ,int y) { int tmp = arr[x]; arr[x] = arr[y]; arr[y] = tmp; } }
相关文章推荐
- 数组中超过出现次数超过一半的数字
- 面试训练数组中出现次数超过一半的数字
- 数组中出现次数超过一半的数字[算法]
- 数组中超过出现次数超过一半的数字
- 数组中出现次数超过一半的数字
- 数组中有一个数字出现的次数超过了数组长度的一半,找出这个数
- 【算法22】寻找数组中出现次数超过一半的数字
- 数组中一个数字出现的次数超过了数组长度的一半,找出这个数字
- 找出数组中出现次数超过数组长度一半的数字
- 【算法习作】已知有一个数字在某数组中出现次数超过一半,求这个数
- 程序员面试题精选100题(47)-数组中出现次数超过一半的数字
- 数组中有一个数字出现的次数超过了数组长度的一半,找出这个数
- 数组中出现次数超过一半的数字
- 数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字。
- 寻找数组中出现次数超过一半的数字
- 数组中出现次数超过一半的数字
- 程序员面试题精选100题(47)-数组中出现次数超过一半的数字
- 数组中出现次数超过一半的数字[算法]
- 微软等数据结构+算法面试100题(23)--数组中超过出现次数超过一半的数字
- 数组中出现次数超过一半的数字