【剑指offer】数组中次数超过一半的数

来源:互联网 发布:淘宝代运营tmyunying 编辑:程序博客网 时间:2024/06/05 08:13

题目描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。

思路
第一个思路是,这个数字出现次数超过数组的一半,那么它一定出现在数组中间,即中位数。因此,我们可以选择数组中任意一个数,对它进行切分(即快速排序中的切分算法,切分后此切分元素左边的数均不大于切分元素,切分元素右边的元素均不小于切分元素)。若切分后此切分元素的下标为n/2,即为中位数,若大于n/2,则在它左边继续上述步骤,反之在右边进行上述步骤。

第二个思路是根据数组特点,这个数字出现的次数比其他数字出现次数的和还多。因此,我们可以保存两个值,一个是数组中的一个数字,另一个是次数,当我们遍历到下一个数字时,当下一个数字与当前保存的值相同,那么我们把次数加1.若不同,则减1,若次数为0,则把当前保存数字改为下一个数字,并把次数设为1.很明显,我们所找的数字就是最后一个把次数设为1的数字,即保存的值。

代码

public class Solution {    public int MoreThanHalfNum_Solution(int [] array) {        if (array == null || array.length <= 0)            return 0;        int result = array[0];        int times = 1;        for (int i = 0; i <array.length; i++){            if (times == 0){                result = array[i];                times = 1;            }            else if (array[i] == result)                times++;            else times--;        }        times = 0;        for (int i = 0; i < array.length; i++){            if (result == array[i])                times++;        }        if (times*2 <= array.length)            return 0;        else return result;    }}
阅读全文
0 0
原创粉丝点击