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

news/2025/1/6 5:04:08/
链接多数元素
题序号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.ppmy.cn/news/1560557.html

相关文章

机器学习之逻辑回归算法、数据标准化处理及数据预测和数据的分类结果报告

逻辑回归算法、数据标准化处理及数据预测和数据的分类结果报告 目录 逻辑回归算法、数据标准化处理及数据预测和数据的分类结果报告1 逻辑回归算法1.1 概念理解1.2 算法导入1.3 算法优缺点 2 LogisticRegression理解2.1查看参数定义2.2 参数理解2.3 方法2.4基本格式 3 数据标准…

单片机端口操作和独立引脚操作

单片机端口操作和独立引脚操作 在单片机编程中&#xff0c;控制I/O端口是最基础的操作之一。通过控制端口&#xff0c;我们可以实现对外设&#xff08;如LED、按键、继电器等&#xff09;的控制。在51单片机中&#xff0c;有两种常见的端口操作方式&#xff1a;整体控制&#…

c# CodeFirst生成表字段加注释

前置&#xff1a;ORM框架工具使用的FreeSql 背景&#xff1a;开发环境中运行接口&#xff0c;所有的表字段以及备注会自动加上&#xff0c;但是在测试环境时运行就只生成了表&#xff0c;没有把每个字段的注释加上 问题检查&#xff1a; FreeSql CodeFirst 支持将 c# 代码内的注…

淘宝商品详情深度解析:利用JAVA爬虫获取item_get_pro接口

引言 在电子商务的世界里&#xff0c;商品详情页是连接商家与消费者的重要桥梁。它不仅展示了商品的详细信息&#xff0c;还直接影响着消费者的购买决策。淘宝作为全球知名的电商平台&#xff0c;提供了丰富的API接口&#xff0c;使得开发者能够获取商品的详细信息。本文将探讨…

springboot544停车场管理系统(论文+源码)_kaic

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统停车场管理系统信息管理难度大&#xff0c;容错率低&…

Makefile介绍

Makefile 介绍 Makefile 是一个用于控制编译过程的文件&#xff0c;最常用于编译 C 和 C 程序。Makefile 包含了一系列的规则&#xff0c;每个规则定义了如何生成一个目标文件&#xff08;通常是可执行文件或对象文件&#xff09;。Make 工具会读取 Makefile 并根据规则自动执…

游戏《燕云十六声》错误码740怎么解决?

一、电脑游戏运行时常见问题及原因 文件丢失与损坏 现象&#xff1a;游戏无法启动&#xff0c;提示缺少关键文件或文件损坏。原因&#xff1a;硬盘故障、病毒攻击、不当卸载或安装等。系统报错与错误码 现象&#xff1a;如《燕云十六声》错误码740&#xff0c;游戏运行时突然弹…

解锁 CSS Grid 的奇妙世界,探寻前端布局的无限可能

文章目录 一、引言二、CSS Grid 基础入门&#xff08;一&#xff09;基本概念解读&#xff08;二&#xff09;关键属性剖析 三、CSS Grid 实用技巧大放送&#xff08;一&#xff09;打造响应式布局&#xff08;二&#xff09;实现复杂的网格结构&#xff08;三&#xff09;灵活…