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

【附JS、Python、C++题解】Leetcode面试150题(12)多数问题

一、题目

169. 多数元素

给定一个大小为 n 的数组 nums ,返回其中的多数元素。
多数元素是指在数组中出现次数大于[n/2]的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。

示例 1:

输入:nums = [3,2,3]
输出:3

示例 2:

输入:nums = [2,2,1,1,1,2,2]
输出:2

二、思路

1. 本题的关键就是用什么方法统计元素出现的次数,由此会引出多种解法。

① 参考前面题目的先排序后处理思路,在这里也可以先进行排序,一个很有用的信息是,我们要找的多数元素,出现次数必须≥n/2,这意味着排序后的中位数一定就是这个多数元素

 Boyer-Moore 投票算法:这种算法的核心思想是通过“投票”机制来找到多数元素。每个元素都可以看作是一张票,投给当前的候选元素。

  • 当遇到相同的元素时,计数器增加,表示支持当前候选元素的票数增加。
  • 当遇到不同的元素时,计数器减少,表示反对当前候选元素的票数增加。
  • 当计数器为 0 时,说明当前没有候选元素,可以选择当前元素作为新的候选元素。

在这道题中:

  • 设置一个计数器 count,初始值为 0。
  • 设置一个候选元素 candidate,初始值为 null

对于数组中的每个元素 num,如果 num 不等于当前候选元素 candidate,将 count 减 1。如果 num 等于当前候选元素 candidate,将 count 加 1。如果 count 为 0,说明当前没有候选元素,将 num 设为候选元素。

③ 可以用哈希表来简化问题(主要是降低时间复杂度)。这里的映射很明显就是数组元素和元素出现次数之间的映射,也就是可以借助哈希表中的键值对匹配来判断出现次数要不要+1.具体见后续的代码。

三、代码

解法一:先排序后处理

① JavaScript:

 function countTimes(nums){let n = nums.length;nums.sort((a,b)=>a-b);return nums[Math.floor(n/2)];
//这里的Math.floor可以确保结果是一个整数,即向下取整。
}

② C++:

int majorityElement(vector<int>& nums) {sort(nums.begin(), nums.end());return nums[nums.size() / 2];
}

③ Python:

def majorityElement(nums]):nums.sort()return nums[len(nums) // 2]

解法二:Boyer-Moore投票算法

① JavaScript:

function countTimes(nums){let major = nulllet count = 0for (let num of nums) {if (count === 0) {major = num}if (major === num) {count++} else {count--}}return major
}

② C++:

int countTimes(const std::vector<int>& nums) {int major = 0;int count = 0;for (int num : nums) {if (count == 0) {major = num;}if (major == num) {count++;} else {count--;}}return major;
}

③ Python:

def count_times(nums):major = Nonecount = 0for num in nums:if count == 0:major = numif major == num:count += 1else:count -= 1return major

解法三:哈希表

① JavaScript:

function countTimes (nums) {let hashTable = {};let n = nums.length;// 遍历数组,统计每个元素的出现次数for (let num of nums) {if (hashTable[num] == null) {hashTable[num] = 1;} else {hashTable[num]++;}}// 找到出现次数大于 n/2 的元素for (let num in hashTable) {if (hashTable[num] > Math.floor(n / 2)) {return parseInt(num);}}return null;  // 如果没有多数元素,返回 null
};

② C++:

int countTimes(const std::vector<int>& nums) {unordered_map<int, int> hashtable;int n = nums.size();// 遍历数组,统计每个元素的出现次数for (int num : nums) {hashtable[num]++;}// 找到出现次数大于 n/2 的元素for (const auto& pair : hashtable) {if (pair.second > n / 2) {return pair.first;}}return -1;  // 如果没有多数元素,返回 -1
}

③ Python:

def count_times(nums):# 使用 Counter 统计每个元素的出现次数counter = Counter(nums)n = len(nums)# 找到出现次数大于 n/2 的元素for num, count in counter.items():if count > n / 2:return numreturn None  # 如果没有多数元素,返回 None

四、反思

1. 之前并不了解Boyer-Moore投票算法,从这道题来看该算法很适合用于高性能要求/内存限制高的题目;

2. 一定要抓住题目中的信息,比如这道题中的n/2,想清楚以后可以简化我们的代码(帮助我们确定中位数一定也就是众数,也就是多数元素)。

相关文章:

【附JS、Python、C++题解】Leetcode面试150题(12)多数问题

一、题目 169. 多数元素 给定一个大小为 n 的数组 nums &#xff0c;返回其中的多数元素。 多数元素是指在数组中出现次数大于[n/2]的元素。你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 示例 1&#xff1a; 输入&#xff1a;nums [3,2,3] 输出&a…...

Centos7 安装 TDengine

Centos7 安装 TDengine 1、简介 官网&#xff1a; https://www.taosdata.com TDengine 是一款开源、高性能、云原生的时序数据库&#xff08;Time Series Database, TSDB&#xff09;, 它专为物联网、车联网、工业互联网、金融、IT 运维等场景优化设计。同时它还带有内建的缓…...

[特殊字符]《Curve DAO 系统学习目录》

本教程旨在系统学习 Curve DAO 项目的整体架构、核心机制、合约设计、治理逻辑与代币经济等内容&#xff0c;帮助开发者全面理解其设计理念及运作方式。 目录总览&#xff1a; 1. Curve 项目概览 • 1.1 Curve 是什么&#xff1f;主要解决什么问题&#xff1f; • 1.2 与其他…...

Pandas **Series**

以下是关于 Pandas Series 的从入门到精通的系统指南&#xff0c;包含核心概念、操作技巧和实战示例&#xff1a; 1. 入门篇&#xff1a;基础操作 1.1 创建Series import pandas as pd# 从列表创建 s1 pd.Series([1, 3, 5, 7, 9]) # 默认数字索引 s2 pd.Series([10, 20, 3…...

Kafka 多线程开发消费者实例

目前&#xff0c;计算机的硬件条件已经大大改善&#xff0c;即使是在普通的笔记本电脑上&#xff0c;多核都已经是标配了&#xff0c;更不用说专业的服务器了。如果跑在强劲服务器机器上的应用程序依然是单线程架构&#xff0c;那实在是有点暴殄天物了。不过&#xff0c;Kafka …...

Linux线程池实现

1.线程池实现 全部代码&#xff1a;whb-helloworld/113 1.唤醒线程 一个是唤醒全部线程&#xff0c;一个是唤醒一个线程。 void WakeUpAllThread(){LockGuard lockguard(_mutex);if (_sleepernum)_cond.Broadcast();LOG(LogLevel::INFO) << "唤醒所有的休眠线程&q…...

Linux《进程概念(上)》

在之前的Linux学习当中我们已经了解了基本的Linux指令以及基础的开发工具的使用&#xff0c;那么接下来我们就要开始Linux当中一个非常重要的部分的学习——进程&#xff0c;在此进程是我们之后Linux学习的基础&#xff0c;并且通过进程的学习会让我们了解更多的操作系统的相关…...

【算法】并查集基础讲解

一、定义 一种树型的数据结构&#xff0c;用于处理一些不相交集合的合并及查询问题。思想是用一个数组表示了整片森林&#xff08;parent&#xff09;&#xff0c;树的根节点唯一标识了一个集合&#xff0c;只要找到了某个元素的的树根&#xff0c;就能确定它在哪个集合里。 …...

C++ STL常用算法之常用集合算法

常用集合算法 学习目标: 掌握常用的集合算法 算法简介: set_intersection // 求两个容器的交集 set_union // 求两个容器的并集 set_difference // 求两个容器的差集 set_intersection 功能描述: 求两个容器的交集 函数原型: set_intersection(iterator beg1, iterat…...

Qt warning LNK4042: 对象被多次指定;已忽略多余的指定

一、常规原因&#xff1a; pro或pri 文件中源文件被多次包含 解决&#xff1a;删除变量 SOURCES 和 HEADERS 中重复条目 二、误用 对于某些pri库可以使用如下代码简写包含 INCLUDEPATH $$PWDHEADERS $$PWD/*.hSOURCES $$PWD/*.cpp但是假如该目录下只有头文件&#xff0c;没…...

ACM模式常用方法总结(Java篇)

文章目录 一、ACM输入输出模式二、重要语法2.1、导包2.2、读取数据2.3、判断是否有下一个数据2.4、输出2.5、关闭scanner2.6、易踩坑点 一、ACM输入输出模式 在力扣上编写代码时使用的是核心代码模式&#xff0c;如果在面试中遇到ACM模式就会比较迷茫&#xff1f;ACM模式要求你…...

日程公布| 第八届地球空间大数据与云计算前沿大会与集中学习(3号通知)

日程公布| 第八届地球空间大数据与云计算前沿大会与集中学习&#xff08;3号通知&#xff09; 日程公布| 第八届地球空间大数据与云计算前沿大会与集中学习&#xff08;3号通知&#xff09;...

leetcode 28 Find the Index of the First Occurrence in a String

直接用kmp算法 class Solution { public:int strStr(string haystack, string needle) {return kmp(haystack,needle);}int kmp(std::string &text,std::string &pattern){int n text.size();int m pattern.size();if(m 0)return 0;std::vector<int> next;ne…...

MATLAB中rmfield函数用法

目录 语法 说明 示例 删除单个字段 删除多个字段 rmfield函数的功能是删除结构体中的字段。 语法 s rmfield(s,field) 说明 s rmfield(s,field) 从结构体数组 s 中删除指定的一个或多个字段。使用字符向量元胞数组或字符串数组指定多个字段。s 的维度保持不变。 示例…...

Linux C语言调用第三方库,第三方库如何编译安装

在 Linux 环境下使用 C 语言调用第三方库时&#xff0c;通常需要先对第三方库进行编译和安装。以下为你详细介绍一般的编译安装步骤&#xff0c;并给出不同类型第三方库&#xff08;如使用 Makefile、CMake 构建系统&#xff09;的具体示例。 一般步骤 1. 获取第三方库源码 …...

leetcode -编辑距离

为了求解将 word1 转换成 word2 所需的最少操作数&#xff0c;可以使用动态规划。以下是详细的解决方案&#xff1a; ### 方法思路 1. **定义状态** dp[i][j] 表示将 word1 的前 i 个字符转换成 word2 的前 j 个字符所需的最少操作数。 2. **状态转移方程** - 如果 word1[…...

【Ollama】大模型运行框架

文章目录 安装与运行导入LLMHugginface模型-转换为-GGUF模型在指定gpu上运行model存储路径设置 ollama接口 官网 github中文介绍 安装与运行 安装教程 安装 wget https://ollama.com/download/ollama-linux-amd64.tgz tar -xzvf ollama-linux-amd64.tgz添加ollama的环境变量…...

字节开源版Manus来袭

字节开源版Manus来袭 项目地址&#xff1a;https://github.com/langmanus/langmanus/blob/main/README_zh.md 在人工智能领域&#xff0c;Manus的出现无疑是一颗重磅炸弹&#xff0c;它凭借强大的通用Agent能力&#xff0c;迅速吸引了全球开发者和AI爱好者的目光。然而&#…...

论文阅读笔记——PointVLA: Injecting the 3D World into Vision-Language-Action Models

PointVLA 论文 现有的 VLA 基于 2D 视觉-语言数据表现良好但缺乏 3D 几何先验导致空间推理缺陷。传统方案&#xff1a;1&#xff09;3D->2D 投影&#xff0c;造成几何信息损失&#xff1b;2&#xff09;3D 数据集少。PointVLA 保留原有 VLA&#xff0c;提取点云特征&#xf…...

selenium实现自动登录项目(5)

1、163邮箱自动登录功能 遇到的问题&#xff1a; 1、登录页面&#xff0c;在定位表单时候&#xff0c;采用id&#xff0c;xpath&#xff0c;css selector都无法定位成功&#xff0c;因为id后面有个随机生成的数字&#xff08;//*[id"x-URS-iframe1741925838640.6785&quo…...

在win11 环境下 新安装 WSL ubuntu + 换国内镜像源 + ssh + 桌面环境 + Pyhton 环境 + vim 设置插件安装

在win11 环境下 新安装 WSL ubuntu ssh gnome 桌面环境 Pyhton 环境 vim 设置插件安装 简单介绍详细流程换国内镜像源安装 ssh 桌面环境python 环境vim 设置插件安装 简单介绍 内容有点长&#xff0c;这里就先简单描述内容了。主要是快速在 Win11 搭建一个 wsl 的 linux 环…...

基于springboot课程学习与互动平台(源码+lw+部署文档+讲解),源码可白嫖!

摘要 随着我国经济的高速发展与人们生活水平的日益提高&#xff0c;人们对生活质量的追求也多种多样。尤其在人们生活节奏不断加快的当下&#xff0c;人们更趋向于足不出户解决生活上的问题&#xff0c;线上管理系统展现了其蓬勃生命力和广阔的前景。与此同时&#xff0c;在此…...

通俗易懂的大模型原理

十分钟揭秘DeepSeek原理&#xff0c;通俗易懂的大语言模型科普&#xff01;_哔哩哔哩_bilibili 最基础原理&#xff0c;x是输入&#xff0c;y是输出。上百万和上百亿的参数 将一句话转化为数字向量 一句话就是向量矩阵 输入矩阵和参数矩阵进行计算得出输出矩阵&#xff0c;因为…...

Vue 3 模板引用(Template Refs)详解与实战示例

Vue 3 模板引用&#xff08;Template Refs&#xff09;详解与实战示例 引言 在 Vue 开发中&#xff0c;通常推荐使用 响应式数据 (ref 和 reactive) 进行数据绑定&#xff0c;而不是直接操作 DOM。但是&#xff0c;在某些情况下&#xff0c;我们确实需要访问某个组件或 DOM 元…...

【Deep Reinforcement Learning Hands-On Third Edition】【序】

书名&#xff1a;深度强化学习实践 第三版 副标题&#xff1a;一个实用且容易跟得上的强化学习指南&#xff0c;从&#xff08;Q-learning和DQNs&#xff09;到&#xff08;PPO和RLHF&#xff09; 作者&#xff1a;Maxim Lapan 1.书中目录 模块一&#xff1a;强化学习初探 章…...

热门索尼S-Log3电影感氛围旅拍LUTS调色预设 Christian Mate Grab - Sony S-Log3 Cinematic LUTs

热门索尼S-Log3电影感氛围旅拍LUTS调色预设 Christian Mate Grab – Sony S-Log3 Cinematic LUTs 我们最好的 Film Look S-Log3 LUT 的集合&#xff0c;适用于索尼无反光镜相机。无论您是在户外、室内、风景还是旅行电影中拍摄&#xff0c;这些 LUT 都经过优化&#xff0c;可为…...

Hadoop/Spark 生态

Hadoop/Spark 生态是大数据处理的核心技术体系&#xff0c;专为解决海量数据的存储、计算和分析问题而设计。以下从底层原理到核心组件详细讲解&#xff0c;帮助你快速建立知识框架&#xff01; 一、为什么需要 Hadoop/Spark&#xff1f; ​传统单机瓶颈&#xff1a; 数据量超…...

.global

.global关键字用来让一个符号对链接器可见&#xff0c;可以供其他链接对象模块使用。 global是告诉编译器&#xff0c;其后是全局可见的名字【变量或函数名】。 .global start 让start符号成为可见的标示符&#xff0c;这样链接器就知道跳转到程序中的什么地方并开始执行。li…...

八股总结(Java)实时更新!

八股总结&#xff08;java&#xff09; ArrayList和LinkedList有什么区别 ArrayList底层是动态数组&#xff0c;LinkedList底层是双向链表&#xff1b;前者利于随机访问&#xff0c;后者利于头尾插入&#xff1b;前者内存连续分配&#xff0c;后者通过指针连接多块不连续的内存…...

@emotion/css + react+动态主题切换

1.下载插件 npm install --save emotion/css 2.创建ThemeContext.tsx // src/ThemeContext.tsx import React, { createContext, useContext, useState } from "react";// 定义主题类型 export type Theme "light" | "dark";// 定义主题上下…...