排序题目:多数元素

文章目录

  • 题目
    • 标题和出处
    • 难度
    • 题目描述
      • 要求
      • 示例
      • 数据范围
      • 进阶
  • 解法一
    • 思路和算法
    • 代码
    • 复杂度分析
  • 解法二
    • 思路和算法
    • 代码
    • 复杂度分析
  • 解法三
    • 思路和算法
    • 代码
    • 复杂度分析

题目

标题和出处

标题:多数元素

出处:169. 多数元素

难度

2 级

题目描述

要求

给定大小为 n \texttt{n} n 的数组 nums \texttt{nums} nums,返回其中的多数元素。

多数元素是指在数组中出现次数大于 ⌊ n 2 ⌋ \Big\lfloor \dfrac{\texttt{n}}{\texttt{2}} \Big\rfloor 2n 的元素。可以假设数组是非空的,并且给定的数组总是存在多数元素。

示例

示例 1:

输入: nums = [3,2,3] \texttt{nums = [3,2,3]} nums = [3,2,3]
输出: 3 \texttt{3} 3

示例 2:

输入: nums = [2,2,1,1,1,2,2] \texttt{nums = [2,2,1,1,1,2,2]} nums = [2,2,1,1,1,2,2]
输出: 2 \texttt{2} 2

数据范围

  • n = nums.length \texttt{n} = \texttt{nums.length} n=nums.length
  • 1 ≤ n ≤ 5 × 10 4 \texttt{1} \le \texttt{n} \le \texttt{5} \times \texttt{10}^\texttt{4} 1n5×104
  • -10 9 ≤ nums[i] ≤ 10 9 \texttt{-10}^\texttt{9} \le \texttt{nums[i]} \le \texttt{10}^\texttt{9} -109nums[i]109

进阶

你可以使用线性时间复杂度和 O(1) \texttt{O(1)} O(1) 空间复杂度解决此问题吗?

解法一

思路和算法

最直观的解法是统计数组中每个元素的出现次数,然后寻找出现次数大于 ⌊ n 2 ⌋ \Big\lfloor \dfrac{n}{2} \Big\rfloor 2n 的元素。

遍历数组,使用哈希表记录每个元素的出现次数,遍历结束之后即可得到数组中每个元素的出现次数。然后遍历哈希表,对于哈希表中的每个元素得到出现次数,返回出现次数大于 ⌊ n 2 ⌋ \Big\lfloor \dfrac{n}{2} \Big\rfloor 2n 的元素。

代码

class Solution {public int majorityElement(int[] nums) {Map<Integer, Integer> counts = new HashMap<Integer, Integer>();for (int num : nums) {counts.put(num, counts.getOrDefault(num, 0) + 1);}int majority = 0;int n = nums.length;Set<Integer> set = counts.keySet();for (int num : set) {if (counts.get(num) > n / 2) {majority = num;break;}}return majority;}
}

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是数组 nums \textit{nums} nums 的长度。遍历数组统计每个元素的出现次数需要 O ( n ) O(n) O(n) 的时间,遍历哈希表得到多数元素也需要 O ( n ) O(n) O(n) 的时间。

  • 空间复杂度: O ( n ) O(n) O(n),其中 n n n 是数组 nums \textit{nums} nums 的长度。需要创建哈希表记录每个元素的出现次数,哈希表中的元素个数不超过 n n n

解法二

思路和算法

另一个解法是将数组排序后得到多数元素。排序后的数组满足相等的元素一定出现在数组中的相邻位置,由于多数元素在数组中的出现次数大于 ⌊ n 2 ⌋ \Big\lfloor \dfrac{n}{2} \Big\rfloor 2n,因此排序后的数组中存在至少 ⌊ n 2 ⌋ + 1 \Big\lfloor \dfrac{n}{2} \Big\rfloor + 1 2n+1 个连续的元素都是多数元素,下标 ⌊ n 2 ⌋ \Big\lfloor \dfrac{n}{2} \Big\rfloor 2n 的元素一定是多数元素。理由如下:

  • 如果多数元素是数组中的最小元素,则排序后的数组从下标 0 0 0 到下标 ⌊ n 2 ⌋ \Big\lfloor \dfrac{n}{2} \Big\rfloor 2n 的元素都是多数元素;

  • 如果多数元素是数组中的最大元素,则排序后的数组从下标 ⌊ n 2 ⌋ \Big\lfloor \dfrac{n}{2} \Big\rfloor 2n 到下标 n − 1 n - 1 n1 的元素都是多数元素;

  • 如果多数元素不是数组中的最小元素和最大元素,则排序后的数组的下标 0 0 0 和下标 n − 1 n - 1 n1 的元素都不是多数元素,多数元素的开始下标一定小于 ⌊ n 2 ⌋ \Big\lfloor \dfrac{n}{2} \Big\rfloor 2n,结束下标一定大于 ⌊ n 2 ⌋ \Big\lfloor \dfrac{n}{2} \Big\rfloor 2n,下标 ⌊ n 2 ⌋ \Big\lfloor \dfrac{n}{2} \Big\rfloor 2n 的元素一定是多数元素。

因此将数组排序之后返回下标 ⌊ n 2 ⌋ \Big\lfloor \dfrac{n}{2} \Big\rfloor 2n 的元素即可。

代码

class Solution {public int majorityElement(int[] nums) {Arrays.sort(nums);int n = nums.length;return nums[n / 2];}
}

复杂度分析

  • 时间复杂度: O ( n log ⁡ n ) O(n \log n) O(nlogn),其中 n n n 是数组 nums \textit{nums} nums 的长度。排序需要 O ( n log ⁡ n ) O(n \log n) O(nlogn) 的时间。

  • 空间复杂度: O ( log ⁡ n ) O(\log n) O(logn),其中 n n n 是数组 nums \textit{nums} nums 的长度。排序需要 O ( log ⁡ n ) O(\log n) O(logn) 的递归调用栈空间。

解法三

思路和算法

寻找多数元素的另一种解法是摩尔投票算法,其时间复杂度是 O ( n ) O(n) O(n),空间复杂度是 O ( 1 ) O(1) O(1)

摩尔投票算法由 Robert S. Boyer 和 J Strother Moore 提出,该算法的基本思想是:在每一轮投票过程中,从数组中删除两个不同的元素,直到投票过程无法继续,此时数组为空或者数组中剩下的元素都相等。

摩尔投票算法的具体做法如下。

  1. 维护多数元素 majority \textit{majority} majority 和多数元素的出现次数 count \textit{count} count,初始时 majority \textit{majority} majority 为数组的首个元素, count = 1 \textit{count} = 1 count=1

  2. 遍历数组中除了首个元素以外的所有元素,当遍历到元素 num \textit{num} num 时,执行如下操作。

    1. 如果 count = 0 \textit{count} = 0 count=0,则将 majority \textit{majority} majority 的值更新为 num \textit{num} num,否则不更新 majority \textit{majority} majority 的值。

    2. 如果 num = majority \textit{num} = \textit{majority} num=majority,则将 count \textit{count} count 1 1 1,否则将 count \textit{count} count 1 1 1

由于这道题中多数元素总是存在,因此遍历结束之后, majority \textit{majority} majority 即为多数元素。

如果不保证多数元素一定存在,则当多数元素不存在时,遍历结束之后的 majority \textit{majority} majority 可能为数组中的任意一个元素。此时需要再次遍历数组,统计 majority \textit{majority} majority 在数组中的出现次数,当 majority \textit{majority} majority 的出现次数大于 ⌊ n 2 ⌋ \Big\lfloor \dfrac{n}{2} \Big\rfloor 2n majority \textit{majority} majority 是多数元素,当 majority \textit{majority} majority 的出现次数小于等于 ⌊ n 2 ⌋ \Big\lfloor \dfrac{n}{2} \Big\rfloor 2n 时没有多数元素。

考虑示例 1, nums = [ 3 , 2 , 3 ] \textit{nums} = [3, 2, 3] nums=[3,2,3],使用摩尔投票算法寻找多数元素的过程如下。

  1. 初始化 majority = nums [ 0 ] = 3 \textit{majority} = \textit{nums}[0] = 3 majority=nums[0]=3 count = 1 \textit{count} = 1 count=1

  2. 遍历到 nums [ 1 ] = 2 \textit{nums}[1] = 2 nums[1]=2

    1. 由于 count = 1 \textit{count} = 1 count=1,因此不更新 majority \textit{majority} majority 的值。

    2. 由于当前元素不等于 majority \textit{majority} majority,因此将 count \textit{count} count 1 1 1 count \textit{count} count 变成 0 0 0

  3. 遍历到 nums [ 2 ] = 3 \textit{nums}[2] = 3 nums[2]=3

    1. 由于 count = 0 \textit{count} = 0 count=0,因此将 majority \textit{majority} majority 的值更新为当前元素 3 3 3

    2. 由于当前元素等于 majority \textit{majority} majority,因此将 count \textit{count} count 1 1 1 count \textit{count} count 变成 1 1 1

  4. 遍历结束, majority = 3 \textit{majority} = 3 majority=3,多数元素是 3 3 3

代码

class Solution {public int majorityElement(int[] nums) {int majority = nums[0];int count = 1;int n = nums.length;for (int i = 1; i < n; i++) {int num = nums[i];if (count == 0) {majority = num;}if (num == majority) {count++;} else {count--;}}return majority;}
}

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是数组 nums \textit{nums} nums 的长度。需要遍历数组 nums \textit{nums} nums 一次。

  • 空间复杂度: O ( 1 ) O(1) O(1)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/848768.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows系统的——终端命令行进入文件夹、打开程序或文件、返回路径、切换磁盘、查看路径包含的所有内容和配置环境变量操作

一、Windows系统的一些基础操作 Windows系统的一些基础操作(通过运行命令方式打开)https://blog.csdn.net/xiaochenXIHUA/article/details/122782021?ops_

GLM-4-9B VLLM 推理使用;openai接口调用

参考: https://huggingface.co/THUDM/glm-4-9b-chat 直接运行vllm后端服务: from transformers import AutoTokenizer from vllm import LLM, SamplingParams# GLM-4-9B-Chat-1M # max_model_len, tp_size

Redis常见异常及优化方案

Redis常见异常及优化方案 Redis集群&#xff08;redis-cluster&#xff09;中的三主三从或者哨兵&#xff08;sentinel&#xff09;模式配置是一种常见的高可用架构&#xff0c;用于解决单点故障和提高数据可靠性。然而&#xff0c;即使在这样的配置下&#xff0c;仍然可能会遇…

vue中SKU实现

通过发送请求获取商品详情数据&#xff0c;包括商品规格(specs)和库存信息(skus)。 选中状态更新&#xff1a;根据当前状态进行激活或取消激活的逻辑&#xff0c;通过为每个规格项添加的“selected”字段来标识是否激活&#xff0c;同时利用样式处理&#xff0c;通过动态类属性…

Shell脚本文本处理三剑客(grep、awk、sed)和正则表达式

一、正则表达式 1.正则表达式基础 正则表达式&#xff08;regular expression&#xff09;描述了一种字符串匹配的模式&#xff08;pattern&#xff09;&#xff0c;可以用来检查一个串是否含有某种子串&#xff0c;将匹配的子串替换或者从某个串中取出符号某个条件的子串等&…

青否数字人直播源码超级管理后台操作步骤!

青否数字人直播源码超级管理后台&#xff0c;我们将详细介绍一下数字人的管理后台的详细操作步骤&#xff01; 1.管理端入口 2.管理后台预览 账号管理&#xff0c;模特管理&#xff0c;声音管理&#xff0c;任务管理&#xff0c;卡类管理&#xff0c;代理商&#xff0c;克隆端 …

七月份大理站、ACM独立出版、高录用稳检索,2024年云计算与大数据国际学术会议(ICCBD 2024)

【ACM独立出版 | 高录用 | EI核心检索稳定】 2024年云计算与大数据国际学术会议&#xff08;ICCBD 2024) 2024 International Conference on Cloud Computing and Big Data (ICCBD 2024) 一、重要信息 大会官网&#xff1a;www.iccbd.net &#xff08;点击投稿/参会/了解会…

小程序 UI 风格,独具匠心

小程序 UI 风格&#xff0c;独具匠心

docker 下载镜像发现超时,加速加速方法

报错原因有可能旧的不能用了&#xff01;&#xff01;&#xff01;换下面的&#xff01;&#xff01;&#xff01; cat /etc/docker/daemon.json "registry-mirrors": ["https://bhu1x6ya.mirror.aliyuncs.com"] 编辑完成后执行以下命令重启docker即可&a…

python方法

目录 公共方法 1.容器类型之间的转化 ​2.运算符 ​3.通用函数 公共方法 1.容器类型之间的转化 # 类型转化 data_str itcast data_list [hadoop, spark, hive, python, hive] data_tupe (hadoop, spark, hive, python, hive) data_set {hadoop, spark, hive, python,…

Linux.小技巧快捷键

1. ctrl c 强制停止 终止某些程序的运行 也可以取消某行命令 2. ctrl d 退出或登出 进入python环境中&#xff0c;使用ctrl d 退出 3.history 查看历史使用了哪些命令 4. ! 历史最近使用的命令的开头 5.使用ctrl r 搜索历史使用的命令 按下 ctrl r 会进入 reverse -…

19 - 查询结果的质量和占比(高频 SQL 50 题基础版)

19 - 查询结果的质量和占比 -- round(avg(rating<3)*100,2)round(avg(if(rating<3,1,0))*100,2) select query_name,round(avg(rating/position),2) quality,round(avg(if(rating<3,1,0))*100,2) poor_query_percentage fromQueries group byquery_name;

vue 响应拦截器,针对某个接口的返回值做特殊处理

1、service.interceptors.response.use 接收两个参数&#xff1a; &#xff08;1&#xff09;参数一&#xff1a;接口成功的回调函数 &#xff08;2&#xff09;参数二&#xff1a;接口失败的回调函数 如要实现以下需求&#xff1a;匹配路径中包含 /api-special 的接口&…

企业微信hook接口协议,ipad协议http,一个用户多个标签

一个用户多个标签 参数名必选类型说明uuid是String每个实例的唯一标识&#xff0c;根据uuid操作具体企业微信 请求示例 {"uuid": "168885xxx599424","userid":0,//用户id"labelid_list":[ //标签id数组0] } 返回示例 {"data…

基于python的网上挂号预约系统-计算机毕业设计源码35796

摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;医院当然也不例外。网上挂号预约系统是以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff0c;采用Py…

Mybatis及其他相关架构设计

目录 Mybatis 文件处理集成 Maven构建 工具包 Mybatis MybatisPlus多表关联分页查询_mybatisplus多表联查分页查询-CSDN博客 Mybatis-plus 批量插入实现_mybatis-plus 批量插入功能-CSDN博客 sharding-mybatis分库分表-CSDN博客 MybatisPlus分页插件配置_mybatisplus配置…

nesting in wrf

Choices for Nesting are:0 no nesting (only available for serial and smpar) 0. no nesting (only available for serial and smpar)1. basic2. preset moves preset moves3. vortex following • default is option 0 for serial/smpar, 1 for dmpar • smpar Shared Mem…

VS code上创建Vue项目详细化教程2-配置并创建Vue项目

目录 1. 环境准备 1.1 Node.js环境配置 1.1.1 安装Node.js 1.1.2 Node配置全局安装目录&#xff1a; 1.2 安装Vue-cli 2. 工程化Vue项目创建 2.1 命令行形式 2.2 UI 界面&#xff08;我们此处采用UI模式&#xff09; 2.2.1 在文件目录下终端输入 2.2.2 创建新项目 2…

源码文章上传无忧,论坛小程序支持

前言 在数字化时代&#xff0c;知识的分享与传播显得愈发重要。为了满足广大创作者和求知者的需求&#xff0c;我们推出了全新的论坛小程序&#xff0c;不仅支持文章、源码、链接等多样化内容的上传&#xff0c;还实现了付费观看功能&#xff0c;为创作者们提供了一个展示才华…

快速自定义表单开发的优势介绍

进行高效率的办公是很多职场人的梦想。借助什么样的软件平台可以提质增效&#xff1f;低代码技术平台是当前较为流行的办公软件平台产品&#xff0c;具有灵活性、易操作、好维护等多个优势特点&#xff0c;操作人员只需要像搭积木似地操作&#xff0c;就可以搭建属于客户的个性…