Leetcode-每日一题【剑指 Offer 39. 数组中出现次数超过一半的数字】

news2024/9/22 21:19:40

题目

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。

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

示例 1:

输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]
输出: 2

限制:

1 <= 数组长度 <= 50000

解题思路

前置知识

摩尔投票算法
摩尔投票算法是一种用于在数组中查找出现次数超过一半的元素的有效算法。算法的核心思想是利用候选元素和计数器进行投票,通过消除不同元素之间的抵消来找到出现次数超过一半的元素。

算法原理
如果数组中存在一个出现次数超过一半的元素,那么这个元素的剩余部分一定会抵消其他元素的出现次数,最终剩下的就是该元素。

算法步骤
初始化候选元素 candidate 为数组的第一个元素,计数器 count 为 1。
从数组的第二个元素开始遍历。
如果当前元素与候选元素相同,则将计数器 count 加 1。
如果当前元素与候选元素不同,则将计数器 count 减 1。
如果计数器 count 减为零,则更新候选元素为当前元素,并将计数器 count 重置为 1。
完成遍历后,候选元素就是出现次数超过一半的元素。
举个例子:

假设数组为 [2, 2, 1, 1, 1, 2, 2]。

初始时,候选元素 candidate 为 2,计数器 count 为 1。
开始遍历数组:
遍历到 2,与候选元素相同,计数器 count 加 1,计数器变为 2。
遍历到 1,与候选元素不同,计数器 count 减 1,计数器变为 1。
遍历到 1,与候选元素不同,计数器 count 减 1,计数器变为 0。
计数器 count 变为 0,更新候选元素为当前元素 1,计数器 count 重置为 1。
遍历到 1,与候选元素相同,计数器 count 加 1,计数器变为 2。
遍历到 2,与候选元素相同,计数器 count 加 1,计数器变为 1。
遍历到 2,与候选元素相同,计数器 count 加 1,计数器变为 0。
计数器count变为0,更新候选元素为当前元素2,计数器count重置为2
完成遍历后,候选元素为 2,它是出现次数超过一半的元素

大概了解了摩尔算法后,我们来看一下这道题

1.题目要求我们查找出出现的次数超过数组长度的一半的数字,我们来画图看一下

2.首先我们先判断一下数组的长度,若数组长度小于2,那么我们直接返回数组中的第一个数字,这个数字就为众数。

3.当数组长度大于2时,我们就使用摩尔投票算法进行查找

举个例子:[1, 2, 3, 2, 2, 2, 5, 4, 2]

我们设置一个变量 cur 去记录当前元素,我们先将nums[0]放入,再设置一个变量 sum用于记录当前元素 cur 的票数,

 4.然后我们开始遍历数组nums,因为已经将nums[0] 放进了cur中,所以我们从nums[1]开始遍历,i = 1 时,nums[i] = 2,此时sum 不等于0,所以 我们不用重新赋值,我们去判断cur 是否等于 nums[1] ,此时cur != nums[1], 所以我们要将 sum --,

5.再往后遍历时,我们发现sum等于0,所以我们只需要对cur重新赋值即可,并将sum 变为1

 

6.按照摩尔投票的思路一直遍历到数组的最后一位,保存再 cur 中的数就是我们要求的中位数。 

 

代码实现

class Solution {
    public int majorityElement(int[] nums) {
        //首先我们判断一下数组中的元素是否小于2,若小于2则直接返回
        if(nums.length < 2){
            return nums[0];
        }
        //用于存放当前元素
        int cur = nums[0];
        //用于存放出现次数
        int sum = 1;
        //开始遍历数组
        for(int i = 1; i < nums.length; i++){
            //如果出现次数为0,就重新给当前元素赋值
            if(sum == 0){
                cur = nums[i];
                sum = 1;
            }else{
                //如果所判断的元素等于当前存放的元素,次数就加一
                if(cur == nums[i]){
                    sum++;
                    //如果所判断的元素不等于当前存放的元素,次数就减一
                }else{
                    sum--;
                }
            }
        }
        return cur;
    }
}

测试结果

 

 

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

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

相关文章

手把手教新手最新Maven3.9.3下载安装配置

当前文档地址&#xff1a;有道云笔记 手把手教新手最新Maven3.9.3下载安装配置 1.下载 Maven官网&#xff1a;Maven – Maven Documentation 1.1打开主页&#xff0c;点击 Download 1.2 选择二进制压缩包&#xff0c;点击apache-maven-3.9.3-bin.zip进行下载 1.3 选择合适的…

租赁类小程序定制开发|租赁管理系统源码|免押租赁系统开发

随着互联网的发展&#xff0c;小程序成为了一种重要的移动应用开发方式。租赁小程序作为其中的一种类型&#xff0c;可以为很多行业提供便利和创新。下面我们将介绍一些适合开发租赁小程序的行业。   房屋租赁行业&#xff1a;租房小程序可以帮助房东和租户快速找到合适的租赁…

史上最全docker启动命令

docker Docker 启动镜像 一、查看当前docker中下载的镜像&#xff0c;如下图&#xff0c;当前我的Docker容器中存在两个镜像 &#xff0c;tomcat、mysql 二、启动镜像 (因启动命令参数过多&#xff0c;同时各种镜像启动时可以增加额外的参数&#xff0c;本次以启动mysql5.6为例…

Manage repositories按钮没有找到

今天安装PyCharm 2022.2.5版本没有发现Manage Repositories&#xff0c;如下图&#xff1a; 解决办法&#xff1a; 第一步&#xff1a;打开pycharm 根据图示按顺序点击底部内容 第二步 &#xff1a;点击加号&#xff0c;添加国内镜像源即可 第三步&#xff1a;国内镜像源地址 …

SpringBoot之Actuator基本使用

SpringBoot之Actuator基本使用 引入分类常用接口含义healthbeansconditionsheapdumpmappingsthreaddumploggersmetrics 引入 <!-- actuator start--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter…

【C++入门到精通】C++入门 —— string类(STL)

目录 一、STL简介 1.STL是什么 2.STL的内容 3.STL的使用前提 二、string类 1.string类 是什么 2.string类的特点和操做 ⭕构造和初始化 ⭕字符串大小和容量 ⭕字符访问和修改 ⭕字符串连接和拼接 ⭕子串操作 ⭕字符串比较 ⭕字符串修改 ⭕获取字符的ASCII码 ⭕…

音频光耦合器

音频光耦合器是一种能够将电信号转换为光信号并进行传输的设备。它通常由发光二极管&#xff08;LED&#xff09;和光敏电阻&#xff08;光电二极管或光敏电阻器&#xff09;组成。 在音频光耦合器中&#xff0c;音频信号经过放大和调节后&#xff0c;被转换为电流信号&#xf…

RISCV 5 RISC-V调用规则

RISCV 5 RISC-V调用规则 1 Register Convention1.1 Integer Register Convention1.2 Floating-point Register Convention 2. Procedure Calling Convention2.1 Integer Calling Convention2.2 Hardware Floating-point Calling Convention2.3 ILP32E Calling Convention2.4 Na…

web前端转正工作总结范文5篇

web前端转正工作总结&#xff08;篇1&#xff09; 来到__有限公司已经三个月了&#xff0c;目前的工作是前端开发&#xff0c;我是一名应届毕业生&#xff0c;之前没有过工作经验&#xff0c;在刚来到__这个大家庭的时候&#xff0c;我就被这里的工作气氛深深地吸引&#xff0…

【Spring】(三)Spring 使用注解存储和读取 Bean对象

文章目录 前言一、使用注解储存 Bean 对象1.1 配置扫描路径1.2 类注解储存 Bean 对象1.2.1 Controller&#xff08;控制器存储&#xff09;1.2.2 Service&#xff08;服务储存&#xff09;1.2.3 Repository&#xff08;仓库存储&#xff09;1.2.4 Component&#xff08;组件储存…

java+vue+springboot基于Web的研究生信息管理系统_u0974

随着社会的不断进步与发展&#xff0c;人们对生活质量要求逐步提升。如果开发一款基于web的研究生管理系统&#xff0c;可以让管理员、研究生和导师在最短的时间里享受到最好的服务&#xff1b;而开发本系统&#xff0c;又能够提高系统整体工作水平&#xff0c;简化工作程序&am…

TiDB Serverless 正式商用,全托管的云服务带来数据管理和应用程序开发的全新体验

八 年 前 &#xff0c;我们构建了 TiDB&#xff0c;一个开源分布式关系型数据库。 我们的目标是重新定义开发者和企业处理数据的方式&#xff0c;满足不断增长的可扩展性、灵活性和性能需求。 从那时起&#xff0c;PingCAP 便致力于为开发者和企业提供快速、灵活和规模化的数据…

flutter-GridView使用

先看效果 代码实现 import package:app/common/util/k_log_util.dart; import package:app/gen/assets.gen.dart; import package:app/pages/widget/top_appbar.dart; import package:flutter/cupertino.dart; import package:flutter/material.dart; import package:flutter_…

机器学习深度学习——卷积的多输入多输出通道

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习——从全连接层到卷积 &#x1f4da;订阅专栏&#xff1a;机器学习&&深度学习 希望文章对你们有所帮…

GPT神器级插件Code Interpreter开放,这里有一份保姆级教程

# 关注并星标腾讯云开发者# 每周4 | 鹅厂一线程序员&#xff0c;为你“试毒”新技术# 第2期 | 腾讯李洛勤&#xff1a;测评 GPT4 Code Interpreter 体验 自 3 月份以来&#xff0c;人们对 GPT-4 API 的兴趣激增&#xff0c;“有数百万开发人员请求访问”。OpenAI 在一篇博客文章…

MySQL日志——慢查询日志

1.慢查询日志 默认情况下&#xff0c;不会记录管理语句&#xff0c;也不会记录不使用索引进行查找的查询。可以 使用log_slow_admin_statements和更改此行为log_queries_not_using_indexes&#xff0c;如下所述。 #慢查询日志 slow_query_log1 #执行时间参数 long_query_time…

Redis面试题-3

Redis面试题-3 14、什么是缓存击穿&#xff1f;该如何解决 缓存击穿是指一个Key非常热点&#xff0c;在不停的扛着大并发&#xff0c;大并发集中对这一个点进行访问&#xff0c;当这个Key在失效的瞬间&#xff0c;持续的大并发就穿破缓存&#xff0c;直接请求数据库&#xff…

SpringBoot整合Nacos实现配置中心

目录 1.Nacos定位 2.Nacos的安装配置 3.整合Nacos 3.1.Nacos安装 3.2.Nacos登录 3.3.配置Nacos 4.Nacos使用 4.1.引入 Maven 依赖 4.2.配置bootstrap.yml 4.3.Nacos配置类 4.4.启用Nacos服务 4.5.测试获取配置 5.加载多个配置文件 datasource-dev.yaml myba…

Antd Table带有分页的全选功能

这种带有分页的全选 如果我们翻页也需要记录跨页的勾选数据 antd自带的onChange事件只能记录选中RowKey值 但是勾选的数据只会是当前页的条数 此时就需要我们结合onSelect和onSelectAll来完成数据的交互 <Tableloading{tableDataloading}rowKey"id"rowSelection{r…

Unity进阶--使用PhotonServer实现服务端和客户端通信--PhotonServer(一)

文章目录 Unity进阶--使用PhotonServer实现服务端和客户端通信服务器的安装和配置添加日志客户端的配置客户端和服务器的通信Dlc 出现vscode引用不好使的时候 Unity进阶–使用PhotonServer实现服务端和客户端通信 服务器的安装和配置 Photon的地址&#xff1a;https://www.ph…