每日一题——多数元素

多数元素

题目链接

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jwOf6Efu-1690383513222)(C:\Users\HUASHUO\AppData\Roaming\Typora\typora-user-images\image-20230726223326912.png)]

方法一:暴力解法

直接利用两层循环,外层循环用来枚举数组的每一个元素,内层循环用来计算每个元素出现的次数,这样就可以求出多数元素了。

显然,这个方法的时间复杂度为O(N^2),效率太低。

int majorityElement(int* nums, int numsSize) {int max_index = 0;	//用来记录多数元素的下标int temp = 0;	//用来统计每个元素出现的次数int max = 0;	//用来记录出现的最大次数for (int i = 0; i < numsSize; i++){temp = 0;	//每一次都是对一个新的元素记录,因此temp要置零//如果出现重复元素,那么就temp++for (int j = 0; j < numsSize; j++){if (nums[i] == nums[j])temp++;}//如果temp大于最大次数,那么就更新多数元素下标,同时更新maxif (temp > max){max_index = i;max = temp;}}//返回多数元素return nums[max_index];
}

方法二:排序

先给出结论:如果一个有序数组中存在多数元素(出现次数大于n/2),那么下标为n / 2处的元素就是多数元素

下面通过画图来分析:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ga8YKyIN-1690383513223)(C:\Users\HUASHUO\AppData\Roaming\Typora\typora-user-images\image-20230726223423877.png)]

我们利用快速排序qsort来实现,时间复杂度为O(NlongN),效率有所提高,但仍无法满足题目要求

int compar(const void* num1, const void* num2)
{return *(int*)num1 - *(int*)num2;
}
int majorityElement(int* nums, int numsSize){//排序qsort(nums,numsSize,sizeof(int),compar);//返回多数元素return nums[numsSize/2];
}

(推荐)方法三:互拼法(Boyer-Moore 投票算法)

我们来举一个形象的例子来解释这个算法:

假设有100个士兵,由于多数元素必然大于n/2,那我们假设多数元素士兵为51个,其他元素士兵为49个,这100个士兵一起去占领一块高地(相同士兵共存,不同士兵相消)

  1. 第一个到来的士兵,直接插上自己阵营的旗帜占领这块高地,现存兵力 count = 1。
  2. 如果新来的士兵和前一个士兵是同一阵营,则集合起来占领高地,~~~~现存兵力 count++;
  3. 如果新来到的士兵不是同一阵营,则前方阵营派一个士兵和它同归于尽。 此时前方阵营兵力count --。
  4. 当下一个士兵到来,发现前方阵营已经没有兵力(双方死光),新士兵就成了领主,现存兵力 count ++。

就这样各路军阀一直以这种以一敌一同归于尽的方式厮杀下去,直到少数阵营都死光,那么最后剩下的几个必然属于多数阵营。(多数阵营 51个,少数阵营只有49个,死剩下的2个就是多数阵营的人)

这一题也一样,数组的第一个元素就是第一个士兵,,同时我们假设第一个元素就是要返回的多数元素temp,接下来遍历整个数组,如果遇到相同元素,那么count++,否则count--,如果count减为0,那么下一个元素就会成为多数元素,temp也要改变,最后遍历完数组得到的temp就是未被抵消的元素,即多数元素

这样,只需要遍历一遍数组,就可以得到想要的结果,时间复杂度为O(N)

int majorityElement(int* nums, int numsSize){int temp = nums[0];int count = 0;for(int i = 0; i < numsSize; i++){if(temp == nums[i])count++;elsecount--;if(count == 0)temp = nums[i + 1];}return temp;
}

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

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

相关文章

关于项目,会问我什么?

作者&#xff1a;阿秀 校招八股文学习网站&#xff1a;https://interviewguide.cn 这是阿秀的第「288」篇原创 小伙伴们大家好&#xff0c;我是阿秀。 在校招求职这块&#xff0c;简历上比较重要的点就是教育背景、实习经历、项目经验三块&#xff0c;其中教育背景都到了秋招这…

C++初阶之一篇文章让你掌握string类(了解和使用)

string类及其模拟实现 1.我们为什么要学习string类2. 标准库中的string类2.1 string类的实例化标准2.2 了解string 3.string类的常用接口说明3.1 string类对象的常见构造3.2 string类对象的容量操作3.3 string类对象的元素访问3.4 string类对象的Iterators&#xff08;迭代器&a…

网络安全合规与标准的主要发展方向

网络安全合规就是避免违反网络安全有关的法律、法规、规章、合同义务以及任何安全要求&#xff0c;标准在网络安全合规工作中扮演着重要的角色。 一、标准在网络安全合规体系中的地位作用 网络安全合规体系包括网络安全有关的法律、法规、规章、其他规范性文件、及合同义务等…

详细解析黑马微信小程序视频--【思维导图知识范围】

语言视频选择收录专辑链接C张雪峰推荐选择了计算机专业之后-在大学期间卷起来-【大学生活篇】JAVA黑马B站视频JAVA部分的知识范围、学习步骤详解JAVAWEB黑马B站视频JAVAWEB部分的知识范围、学习步骤详解SpringBootSpringBoot知识范围-学习步骤【JSB系列之000】微信小程序详细解…

《深度解析Docker与微服务架构:构建灵活可扩展的现代应用》

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

通过 API 远程管理 Jenkins

目录 前言&#xff1a; 背景介绍 Jenkins Remote API 的简介 Jenkins Remote API 的调用 Read More ... 前言&#xff1a; Jenkins 是一种开源的持续集成工具&#xff0c;可以帮助我们更加方便地进行软件开发和测试工作。通过 API 远程管理 Jenkins 可以帮助我们更加方便…

在家下载论文使用哪些论文下载工具比较好

在家下载论文如果不借助论文下载工具是非常艰难的事情&#xff0c;因为很多查找下载论文的数据库都是需要账号权限才可使用的。 例如&#xff0c;我们查找中文论文常用的知网、万方等数据库以及众多国外论文数据库。 在家下载知网、万方数据库论文可用下面的方法&#xff1a;…

SpringCloudAlibaba微服务实战系列(三)Sentinel1.8.0+流控

SpringCloudAlibaba–Sentinel Sentinel被称为分布式系统的流量防卫兵&#xff0c;是阿里开源流量框架&#xff0c;从服务限流、降级、熔断等多个纬度保护服务。Sentinel同时提供了简洁易用的控制台&#xff0c;可以看到接入应用的秒级数据&#xff0c;并可以在控制台设置一些…

Guitar Pro8吉他谱制作软件好不好用?

吉他谱是学习和演奏吉他的重要工具之一&#xff0c;对于吉他爱好者而言&#xff0c;掌握一款优秀的吉他谱制作软件是必不可少的。随着科技的进步&#xff0c;现在有许多吉他谱制作软件可供选择。下面我们就来看吉他谱制作软件哪个好&#xff0c;以及怎么制作吉他谱子吧&#xf…

【OpenGL学习】之着色器GLSL基础

基本类型: 类型说明void空类型,即不返回任何值bool布尔类型 true,falseint带符号的整数 signed integerfloat带符号的浮点数 floating scalarvec2, vec3, vec4n维浮点数向量 n-component floating point vectorbvec2, bvec3, bvec4n维布尔向量 Boolean vectorivec2, ivec3, iv…

005.PADS VX2.4自定义快捷键设置及修改

005.PADS VX2.4自定义快捷键设置及修改 若部分快捷键不符合操作习惯或者部分功能系统未设置快捷键&#xff0c;可自定义快捷键功能&#xff0c;自定义快捷键功能需要注意设置的按键需要与无模命令区分&#xff0c;以免与无模命令冲突&#xff1b;如若需要修改某个快捷功能&…

年轻小伙爆肝ARST

关于 ARTS 的释义 —— 每周完成一个 ARTS&#xff1a; ⭐️● Algorithm: 每周至少做一个 LeetCode 的算法题 ⭐️● Review: 阅读并点评至少一篇技术文章 ⭐️● Tips: 学习至少一个技术技巧 ⭐️● Share: 分享一篇有观点和思考的技术文章 希望通过此次活动能聚集一波热爱技…

移动端商品详情页设计

效果图 代码如下 页面设计 <div class"container"><!--商品详情 start--><van-image class"goods-item-image" :src"goods.goodsHeadImg"></van-image><div class"goods-price">&#xffe5;<span&…

Docker consul容器服务更新与发现

Docker consul容器服务更新与发现 一、什么事服务注册与发现二、什么是consul三、consul部署1、consul服务器2、registrator服务器3、consul-template 一、什么事服务注册与发现 服务注册与发现是微服务架构中不可或缺的重要组件。起初服务都是单节点的&#xff0c;不保障高可…

ROS-Moveit机械臂追踪二维码(四)

ROS-Moveit机械臂追踪二维码(四) 在仿真环境增加相机 <gazebo reference"camera_depth_frame"><sensor name"camera1" type"depth"><always_on>true</always_on><update_rate>20.0</update_rate><came…

KnowStreaming系列教程第二篇——项目整体架构分析

一、KS项目代码结构&#xff1a; ks项目代码结构如上&#xff1a; (1)km-console 是前端部分&#xff0c;基于React开发 (2)km-rest 是后端部分&#xff0c;主要是接受前端请求&#xff0c;对应controller相关代码所在模块 (3)km-biz:业务逻辑处理 (4)km-core:核心逻辑 (5…

(学习笔记-IP)IP协议相关技术

DNS 我们在上网的时候&#xff0c;通常使用的方式是域名&#xff0c;而不是IP地址&#xff0c;因为域名方便人类记忆。 那么实现这一技术的就是DNS域名解析器&#xff0c;DNS可以将域名网址自动转换为具体的IP地址。 域名的层级关系 DNS中的域名都是用句点来分隔的&#xff0…

Java_23_并发包

并发包 并发包的来历&#xff1a; 在实际开发中如果不需要考虑线程安全问题&#xff0c;大家不需要做线程安全&#xff0c;因为如果做了反而性能不好&#xff01; 但是开发中有很多业务是需要考虑线程安全问题的&#xff0c;此时就必须考虑了。否则业务出现问题。 Java为很多业…

RNN架构解析——传统RNN模型

目录 传统RNN的内部结构图使用RNN优点和缺点 传统RNN的内部结构图 使用RNN rnnnn.RNN(5,6,1) #第一个参数是输入张量x的维度&#xff0c;第二个是隐藏层维度&#xff0c;第三层是隐藏层的层数 input1torch.randn(1,3,5) #第一个是输入序列的长度&#xff0c;第二个是批次的样本…

Golang指针详解

要搞明白Go语言中的指针需要先知道3个概念&#xff1a;指针地址、指针类型和指针取值。 指针介绍 我们知道变量是用来存储数据的&#xff0c;变量的本质是给存储数据的内存地址起了一个好记的别名。比如我们定义了一个变量 a : 10 ,这个时候可以直接通过 a 这个变量来读取内存…