题目描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
反思:这个看过,也做过,但是又忘记了,像这样的题目,就要背下来
思路:
方法一:排序 O(n logn)
方法二:基于快排的O(n)算法
基于方法:找到数组中任意第k大的数字
思路:先思考一下,如果按照第一种方法,排好序,那么处于中间的数字就是数组中出现次数超过一半的数字。那么我们可以利用快排的思想直接寻找第n/2个数字。
在做题的过程中,如果当前基准元素<n/2 ,那么中间数字位于基准元素的右边;反之左边。
基于递归的思想去寻找
public class Solution {
public int MoreThanHalfNum_Solution(int [] array) {
//判断无效的输入
if(array == null) return 0;
if(array.length == 0) return 0;
//基于快速排序的递归思想找到第k=n/2的数字
int k = array.length/2;
int num = Partition(array , k , 0, array.length-1);
/