【剑指offer】28:数组中出现次数超过一半的数字

题目描述:

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

解题思路:

方法一:根据数组特点,数组中有一个数字出现的次数超过数组长度的一半,也就是说它出现的次数比其他所有数字出现的次数之和还要多。我们在遍历之前设置两个值,times用来存储数字出现的次数,result存储数值。第一个for循环用来找出出现次数最多的数字(每次循环判断此时的值与result是否相同,相同则次数加1,不同则次数减一,当次数变为0的时候说明该数字不可能为多数元素,将result设置为下一个数字,次数设为1),也就是初步确定result值;第二个for循环用来判断这个result的值是否超过数组长度一半。

方法二:首先对数组进行排序,在一个有序数组中,次数超过一半的必定是中位数,那么可以直接取出中位数,然后遍历数组,看中位数是否出现次数超过一半。

代码实现:

(C语言实现方法一):

int MoreThanHalfNum_Solution(int* numbers, int numbersLen ) {
    // write code here
    int times = 1, result = numbers[0];
    if (numbersLen == 0) return 0;
    if (numbersLen == 1) return result;
    for (int i = 1; i < numbersLen; i++)
    {
        if (numbers[i] == result) 
        {
            times++;
        }else 
        {
            times--;
            if (times == 0)
            {
                result = numbers[i];
                times = 1;
            }
        }
    }
    times = 0;
    for (int i = 0; i < numbersLen; i++)
    {
        if (result == numbers[i])
        {
            times++;
        }
        if (times > numbersLen / 2)
        {
            return result;
        }
    }
    return 0;
}

 

(JavaScript实现方法二):

function MoreThanHalfNum_Solution(numbers) {
    var newArray = numbers.sort(),
        mid = Math.floor(newArray.length / 2),
        result = newArray[mid],
        times = 0;
    for (var i = 0; i < newArray.length; i++) {
        if (result == newArray[i]) {
            times++;
        }
        if (times > mid) {
            return result
        }
    }
    return 0;
}

 

posted @ 2021-04-20 22:13  zhang十六  阅读(83)  评论(0)    收藏  举报