[算法] leetcode 169. 多数元素

69 阅读2分钟

169. 多数元素

题目

给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。

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

示例

  • 示例 1:

输入:nums = [3,2,3]

输出:3

  • 示例 2:

输入:nums = [2,2,1,1,1,2,2]

输出:2

分析

  • 本题重点在于多数元素的个数是大于数组的一半,也就是说比其他元素加起来都多

    • 可以理解成, 每次从数组中删除两个不同的元素, 最后剩下的元素就是多数元素
  • 取巧的想法是

    • 设x是多数元素, 则x的个数要超过其他元素的个数总和
    • 设count是当前x的个数
      • 何如比较x和其他元素的总个数呢
        • 遍历数组
          • 如果count == 0, 说明前面的元素都抵消了, 即前面的元素有成对不一样的, 剩下的数组也一定符合题意
          • 假定当前元素就是多数元素, 继续遍历
            • 将count重制为1
          • 如果当前元素与x相同
            • 计数加一
          • 如果当前元素与x不同
            • 计数减一
        • 遍历结束, 此时x就是数组中相互抵消之后剩下的多数元素

代码

class Solution {
    public int majorityElement(int[] nums) {
        // 初始化当前假定的多数元素的个数为1
        int count = 1;
        // 假定第一个元素就是多数元素
        int tar = nums[0];
        int len = nums.length;
        // 遍历数组
        for(int i = 1; i < len;i++) {
            // 当前遍历的值
            int cur = nums[i];
            // count = 0, 说明当前遍历前面的元素已经相互一一抵消
            if (count == 0) {
                // 继续假定当前元素是多数元素
                tar = cur;
                // 重制count
                count = 1;
            // count != 0 说明 当前元素有一个元素满足多数元素的要求
            } else {
                // 当前元素和tar相同
                if(cur == tar) {
                    // 计数加一
                    count++;
                // 当前元素和tar不相同, 抵消一个tar
                } else {
                    // 计数减一
                    count--;
                }
            }
        }
        // 最后没有被抵消的元素就是多数元素
        return tar;
    }
}

结果