📜  查找多数元素|套装3(位魔术)(1)

📅  最后修改于: 2023-12-03 15:10:44.234000             🧑  作者: Mango

查找多数元素|套装3(位魔术)

本文介绍一种位运算的套路,用于解决查找多数元素问题。

问题描述

给定一个长度为n的数组,找出出现次数超过n/2的元素。

示例1:

输入: [3,2,3]
输出: 3

示例2:

输入: [2,2,1,1,1,2,2]
输出: 2
解法
思路

假设有一个数出现次数大于n/2,那么它在二进制下的每一位都会出现次数大于n/2次。

我们可以依次考虑每一位,统计每一位上1出现的次数,如果大于n/2,则该位上一定是1,否则就是0。

最后我们将所有1统计起来,这个数就出来了。

代码
public int majorityElement(int[] nums) {
    int res = 0;
    int n = nums.length;
    for (int i = 0; i < 32; i++) {
        int count = 0;
        for (int j = 0; j < n; j++) {
            if (((nums[j] >> i) & 1) == 1) {
                count++;
            }
        }
        if (count > n / 2) {
            res |= (1 << i);
        }
    }
    return res;
}
复杂度分析

时间复杂度为O(32n),空间复杂度为O(1)。