当前位置: 首页 > article >正文

leetcode 面试经典 150 题:多数元素

链接多数元素
题序号169
题型数组
解法1. 排序法、2. Boyer-Moore投票算法
难度简单
熟练度✅✅✅✅✅

题目

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

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

  • 示例 1:
    输入:nums = [3,2,3]
    输出:3

  • 示例 2:
    输入:nums = [2,2,1,1,1,2,2]
    输出:2

  • 提示:
    n == nums.length
    1 <= n <= 5 * 104
    -109 <= nums[i] <= 109

  • 进阶:
    尝试设计时间复杂度为 O(n)、空间复杂度为 O(1) 的算法解决此问题。

题解

排序法

  1. 核心要点:先排序,下标n/2的位置一定是多数元素,复杂度根据排序算法的复杂度来。
  2. 复杂度:排序算法的时间复杂度通常是 O(n log n),其中 n 是数组的长度。这意味着对于大型数组,排序方法可能比 Boyer-Moore 投票算法慢,后者的时间复杂度为 O(n)。
  3. c++ 实现算法
//排序法
class Solution2 {
public:
    int majorityElement(vector<int>& nums) {
        sort(nums.begin(), nums.end());

        return (nums[nums.size()/2]);
    }
};

Boyer-Moore投票算法

  1. Boyer-Moore投票:Boyer-Moore投票算法是一种用于在数组中找出出现次数超过一半的元素(即多数元素)的高效算法。这个算法由Robert S. Boyer和J Strother Moore于1981年提出。算法的核心思想是通过两次遍历数组的过程来找出多数元素。
  2. 核心要点:该题适合使用Boyer-Moore投票算法,即在一个序列中找出一个出现次数超过n/2的元素(如果存在的话)。
  3. 复杂度:时间复杂度 O(n), 空间复杂度 O(1)
  4. c++ 实现算法
class Solution {
public:
    int majorityElement(vector<int>& nums) {
        int count = 0;
        int candidate = 0;
        for(int i = 0; i < nums.size(); i++){
            if(count == 0){
                candidate = nums[i];
            }

            count += (candidate == nums[i]) ? 1 : -1;
        }
        
        return candidate;
    }
};
  1. 推演
  • 假设我们有一个数组 nums = [3, 2, 3]:

  • 初始化:count = 0,candidate = 0。

  • 遍历 nums[0] = 3:
    count 为0,所以将 nums[0] 设为 candidate,即 candidate = 3,count = 1。

  • 遍历 nums[1] = 2:
    nums[1] 与 candidate 不同,count 减1,count = 0。

  • 遍历 nums[2] = 3:
    count 为0,所以将 nums[2] 设为 candidate,即 candidate = 3,count = 1。

  • 遍历结束后,candidate = 3,这是数组中的多数元素。

完整demo

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        int count = 0;
        int candidate = 0;
        for(int i = 0; i < nums.size(); i++){
            if(count == 0){
                candidate = nums[i];
            }

            count += (candidate == nums[i]) ? 1 : -1;
        }
        
        return candidate;
    }
};

//排序法
class Solution2 {
public:
    int majorityElement(vector<int>& nums) {
        sort(nums.begin(), nums.end());

        return (nums[nums.size()/2]);
    }
};



int  main(){

    vector <int> nums = {3, 2, 3};
    Solution2 solution;

    int element = solution.majorityElement(nums);

    cout << "major elemet: " << element << endl;

    return 0;
}

http://www.kler.cn/a/465490.html

相关文章:

  • 【QED】kouki与阶乘之间的那些事?
  • Linux之ARM(MX6U)裸机篇----9.GPIO中断实验
  • 家教老师预约平台小程序系统开发方案
  • 掌握RabbitMQ:全面知识点汇总与实践指南
  • JavaVue-Get请求 数组参数(qs格式化前端数据)
  • Chapter4.2:Normalizing activations with layer normalization
  • 工信部电子标准院计算机视觉证书报考指南!
  • 项目引入MybatisPlus
  • npm提示Install fail! Error_ EBUSY_ resource busy or
  • STM32G431收发CAN
  • python的urllib模块和http模块
  • stm32f103zet6 ds18b20
  • openbmc sdk09.03 适配(一)
  • 内存卡乱码问题全解析与高效恢复方案
  • 【Java基础】Java数据类型阐述、基本数据类型的占用和范围、二进制的讲述
  • iOS 11 中的 HEIF 图像格式 - 您需要了解的内容
  • tomcat配置存放静态资源,实现网页访问并下载
  • node.js之---CommonJS 模块
  • Monolith - 大规模推荐建模的深度学习框架
  • C#Halcon交互绘制ROI
  • 啥是大模型
  • 【Golang 面试题】每日 3 题(十七)
  • Objective-C语言的软件开发工具
  • 热备份路由HSRP及配置案例
  • 大数据学习(33)-续集
  • 如何配置【Docker镜像】加速器+【Docker镜像】的使用