【C++】每日一题 169 多数元素

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

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

#include <vector>

class Solution {
public:
    int majorityElement(std::vector<int>& nums) {
        int candidate = nums[0];
        int count = 1;

        for (int i = 1; i < nums.size(); ++i) {
            if (nums[i] == candidate) {
                // 如果当前元素与候选元素相同,则计数器加一
                ++count;
            } else {
                // 如果当前元素与候选元素不同,则计数器减一
                --count;
                // 当计数器变为 0 时,重新选择候选元素
                if (count == 0) {
                    candidate = nums[i];
                    count = 1;
                }
            }
        }

        // 经过上述遍历后,候选元素就是多数元素
        return candidate;
    }
};

int main() {
    std::vector<int> nums = {3, 2, 3};
    Solution solution;
    int majority = solution.majorityElement(nums);
    return 0;
}

可以使用摩尔投票算法(Boyer-Moore Voting Algorithm)来解决这个问题,在遍历数组时,维护一个候选元素和一个计数器。初始时,候选元素设为数组的第一个元素,计数器设为 1。然后从数组的第二个元素开始遍历,如果当前元素与候选元素相同,则计数器加一,否则计数器减一。当计数器减为 0 时,重新选择候选元素为当前元素,并将计数器重置为 1。最终选出的候选元素就是多数元素。

这个算法的精髓在于,在遍历过程中,如果存在多数元素,它的出现次数一定比其他所有元素的出现次数之和还要多。因此,候选元素的出现次数减去其他非候选元素的出现次数,最终结果一定大于 0。

对于时间复杂度和空间复杂度的分析

时间复杂度:算法只需要对数组进行一次线性遍历,因此时间复杂度为 O(n),其中 n 是数组的长度。

空间复杂度:算法只需要常数级别的额外空间用于存储候选元素和计数器,因此空间复杂度为 O(1)。

相关推荐

  1. C++】每日 169 多数元素

    2024-04-05 19:38:02       30 阅读
  2. 多数元素算法(leetcode第169)

    2024-04-05 19:38:02       52 阅读
  3. [经典面试]169. 多数元素

    2024-04-05 19:38:02       52 阅读
  4. [leetcode] 169. 多数元素

    2024-04-05 19:38:02       54 阅读
  5. 169.多数元素

    2024-04-05 19:38:02       37 阅读
  6. leetcode 169.多数元素

    2024-04-05 19:38:02       199 阅读
  7. LeetCode 169. 多数元素

    2024-04-05 19:38:02       38 阅读
  8. 169. 多数元素

    2024-04-05 19:38:02       35 阅读
  9. leetcode-169-多数元素

    2024-04-05 19:38:02       31 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-05 19:38:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-05 19:38:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-05 19:38:02       82 阅读
  4. Python语言-面向对象

    2024-04-05 19:38:02       91 阅读

热门阅读

  1. python之while循环

    2024-04-05 19:38:02       36 阅读
  2. leetcode:416.分割等和子集

    2024-04-05 19:38:02       36 阅读
  3. 软件开发与设计的哲学思想一

    2024-04-05 19:38:02       37 阅读
  4. 3.创建型模式--创建者模式

    2024-04-05 19:38:02       33 阅读
  5. mybatis报错无法update数据

    2024-04-05 19:38:02       37 阅读
  6. 前端和后端在软件开发中的两个重要部分

    2024-04-05 19:38:02       38 阅读
  7. 树状数组模板

    2024-04-05 19:38:02       43 阅读
  8. 自动化缺陷检测:提升产品质量的关键

    2024-04-05 19:38:02       35 阅读
  9. 谷歌(Google)技术面试概述

    2024-04-05 19:38:02       35 阅读
  10. 逻辑回归都有什么类型

    2024-04-05 19:38:02       28 阅读
  11. RKE2部署k8s集群实战

    2024-04-05 19:38:02       37 阅读
  12. docker入门

    2024-04-05 19:38:02       45 阅读