【LeetCode 面试经典150题】169. Majority Element 多数元素

169. Majority Element

题目大意

Given an array nums of size n, return the majority element.

The majority element is the element that appears more than ⌊n / 2⌋ times. You may assume that the majority element always exists in the array.

中文释义

给定一个大小为 n 的数组 nums,返回多数元素。

多数元素是指在数组中出现次数超过 ⌊n / 2⌋ 的元素。你可以假设数组中总是存在多数元素。

示例

Example 1:

  • Input: nums = [3,2,3]
  • Output: 3

Example 2:

  • Input: nums = [2,2,1,1,1,2,2]
  • Output: 2

Constraints:

  • n == nums.length
  • 1 <= n <= 5 * 10^4
  • -10^9 <= nums[i] <= 10^9

解题思路

算法描述 - 摩尔投票法

使用了摩尔投票法来找到数组中的多数元素。多数元素定义为在数组中出现次数超过数组长度一半的元素。

  1. 初始化变量:

    • candidate: 作为多数元素的候选,初始设为数组的第一个元素。
    • cnt: 记录候选元素的"积分",初始设为1,代表候选元素的初始积分。
  2. 遍历数组 - 应用摩尔投票法:

    • 从数组的第二个元素开始遍历。
    • 摩尔投票法的核心在于配对不同的元素并消除它们。具体实现为:
      • 如果 cnt 为0,说明之前的候选元素和其他元素已经完全抵消,因此需要选取当前元素作为新的候选元素,并重置 cnt 为1。
      • 在遍历过程中,如果当前元素与候选元素相同,cnt 加1(增加积分);如果不同,则 cnt 减1(减少积分)。
  3. 返回结果:

    • 遍历完成后,由于多数元素的数量超过数组长度的一半,所以最终剩下的 candidate 即为所求的多数元素。
cpp 复制代码
class Solution {
public:
    int majorityElement(vector<int>& nums) {
        int candidate = nums[0], cnt = 1;
        for (int i = 1; i < nums.size(); i++) {
            if (cnt == 0) {
                candidate = nums[i];
                cnt = 1;
            } else {
                cnt = candidate == nums[i] ? cnt + 1 : cnt - 1;
            }
        }
        return candidate;
    }
};
相关推荐
拓恒技术4 小时前
无人机巡检AI算法的工程化落地:从需求到交付的5个核心环节
人工智能·算法·无人机
晨曦中的暮雨4 小时前
限流算法——固定窗口、滑动窗口、漏桶、令牌桶
java·开发语言·算法
怕浪猫4 小时前
Claude Code vs Codex:Computer Use 实现原理深度拆解
算法·面试·github
文丑颜不良啊5 小时前
LeetCode876~900题目解析
java·leetcode
罗西的思考6 小时前
AI 时代的 “房谋杜断”:如何培养能力、品味与判断力
人工智能·算法·机器学习
淡海水6 小时前
07-02-源码-.NET Core GC分配路径
算法·unity·c#·.netcore·gc·1024程序员节
下一站春风里8 小时前
位运算完整学习笔记:按位与(&)+ 异或(^)
开发语言·c++·算法
DRobot8 小时前
【机械制图与CAD实战(二十五)】螺纹的表示方法
算法·机械制图
考研保研资料分享8 小时前
无论文竞赛保研中科院植物所:三场考核、科研追问与准备复盘
面试
用户老李8 小时前
卡尔曼滤波自学教程 10:无迹卡尔曼滤波(UKF)
算法