【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;
    }
};
相关推荐
_GR14 分钟前
每日OJ题_牛客_牛牛冲钻五_模拟_C++_Java
java·数据结构·c++·算法·动态规划
ROBIN__dyc26 分钟前
表达式
算法
无限大.29 分钟前
c语言实例
c语言·数据结构·算法
六点半88834 分钟前
【C++】速通涉及 “vector” 的经典OJ编程题
开发语言·c++·算法·青少年编程·推荐算法
@haihi42 分钟前
冒泡排序,插入排序,快速排序,选择排序
数据结构·算法·排序算法
quaer1 小时前
Open-Sora全面开源?
开发语言·算法·机器学习·matlab·矩阵
Hello.Reader1 小时前
TopK算法在大数据重复数据分析中的应用与挑战
大数据·算法·数据分析
coduck_S12004zbj1 小时前
csp-j模拟五补题报告
c++·算法·图论
洛临_1 小时前
【C语言】基础篇
c语言·算法
_.Switch1 小时前
Python机器学习模型的部署与维护:版本管理、监控与更新策略
开发语言·人工智能·python·算法·机器学习