Skip to content

LeetCode-面试题39-数组中出现次数超过一半的数字

题目

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。

你可以假设数组是非空的,并且给定的数组总是存在多数元素。

示例:

输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]
输出: 2

限制:

1 <= 数组长度 <= 50000

解题思路

方法1、投票法:

把众数的票数记为+1,非众数票数记为-1,如果众数出现的次数超过数组长度的一般,则一定会有所有的数字的票数和>0

方法2、哈希Map

空间换时间,没有出现在map中的数添加进去,出现过了则次数+1,之后获取次数最大的key即可

Java代码

java
class Solution {
    public int majorityElement(int[] nums) {
        if(nums==null||nums.length==0)
            return 0;
        int result = nums[0];
        int times = 1;
        for(int i=1;i<nums.length;i++){
            if(times==0){
                result = nums[i];
                times = 1;
            }
            else if(nums[i]==result)
                times++;
            else
                times--;
        }
        return result;
    }
}

Python代码

python
class Solution:
    def majorityElement(self, nums: List[int]) -> int:
        if not nums: return 0
        numsMap = {}
        for i in nums:
            if i not in numsMap:
                numsMap[i]=1
            else:
                numsMap[i]+=1
        return max(numsMap,key=numsMap.get)