算法通关村第三关【黄金】| 数组元素出现次数问题

news2025/1/21 15:31:05

1.数字出现的次数超过数组长度的一半

 

方法一、使用Map键值对来记录每个元素出现的次数,返回次数大于一半的

class Solution {
    public int majorityElement(int[] nums) {
        Map<Integer,Integer> map = new HashMap<>();
        for(int i = 0;i<nums.length;i++){
            map.put(nums[i],map.getOrDefault(nums[i],0)+1);
            if(map.get(nums[i])>nums.length/2){
                return nums[i];
            }
        }
        return 0;
    }
}

方法二、投票算法,我愿称之为自相残杀一换一算法

关键是把握同时减少一个众数和非众数并不会影响众数的地位

例如: [1, 2, 3, 2, 2, 2, 5, 4, 2]

令result = 1 times = 1

当下一个不与result相等时就减一,否则就加一(敌方一换一,我方纳入阵营)

当减为零的时候就更换result为下一个值(自相残杀全g)

开始循环1,2不相同,times-1为0,result更换为3,剩余 [ 3, 2, 2, 2, 5, 4, 2]

3,2不相同,times-1为0,result更换为2,剩余[ 2, 2, 5, 4, 2]

2,2相同,times+1为2,剩余[ 5, 4, 2]

2,5不相同,times-1为1,剩余[ 4 , 2 ]

2,4不相同,times-1为0,更换为2

最终2胜出

class Solution {
    public int majorityElement(int[] nums) {
        int result = 0;
        int times = 0;
        for(int i = 0;i<nums.length;i++){
            if(times == 0){
                result = nums[i];
            }
            times = (nums[i] == result) ? times+1 : times-1;
        }
        return result;
    }
}

2. 只出现一次的数字

 

方法一、使用辅助哈希表

这里使用Set集合去重特性比使用Map集合更优,不需要再一次遍历Map

class Solution {
    public int singleNumber(int[] nums) {
        Set<Integer> set = new HashSet<>();
        for(int num : nums){
            if(!set.add(num)){
                set.remove(num);
            }
        }
        return set.toArray(new Integer[0])[0];
    }
}

 方法二、位运算之异或

关键把握相同数字异或结果为0,因为异或位运算的本质就是每位相同取0不同取1,数字相同结果就是全部取0。

当数组中仅一个数字是单独的,其他都是两两成对,就说明异或运算下来最终结果就是单独的那个数字,其他全部取0。

Picture1.png

class Solution {
    public int singleNumber(int[] nums) {
        int res = 0;
        for(int num : nums){
            res ^= num;
        }
        return res;
    }
}

 3.颜色分类(荷兰国旗)

方法一、单指针

循环一遍将0交换到前面

再循环一遍将1交换到中间

class Solution {
    public void sortColors(int[] nums) {
        int n = nums.length;
        int p = 0;
        for(int i = 0;i<nums.length;i++){
            if(nums[i] == 0){
                int t = nums[p];
                nums[p] = nums[i];
                nums[i] = t;
                p++;
            }
        }
        for(int i = p;i<nums.length;i++){
            if(nums[i] == 1){
                int t = nums[p];
                nums[p] = nums[i];
                nums[i] = t;
                p++;
            }
        }
    }
}

方法二、双指针

p0保留交换0的位置

p1保留交换1的位置

遍历一遍:当值为0直接和p0交换,一个元素成功归位,一个萝卜一个坑,p0++、p1++,

                  当值为1和p1交换,元素并不代表成功归位(1得在0后面),但还是一个萝卜一个坑,                    p0不能动,p1++

但是注意会出现这么一种状况,当元素为1时和p1交换但是p0没动,p1>p0,下一次遇到0和p0交换就会把1换到后面去,需要和p1再交换一次,这时才算归位

class Solution {
    public void sortColors(int[] nums) {
        int p0 = 0;
        int p1 = 0;
        for(int i = 0;i<nums.length;i++){
            if(nums[i] == 0){
                swap(nums,p0,i);
                if(p0<p1){
                    swap(nums,p1,i);
                }
                p1++;
                p0++;
            }else if(nums[i] == 1){
                swap(nums,p1,i);
                p1++;
            }
        }
    }
    
    public void swap(int[] nums,int n,int m){
        int t = nums[n];
        nums[n] = nums[m];
        nums[m] = t;
    }
}

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

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

相关文章

解决跨时区跨语言的国外大文件传输问题

随着信息技术的飞速发展和全球化的深入推进&#xff0c;跨国团队、跨国公司之间的合作变得越来越普遍。在这种背景下&#xff0c;大文件的传输成为了一个经常遇到的挑战。跨语言、跨时区的国外大文件传输&#xff0c;由于涉及到复杂的网络环境、不同国家法律法规等多方面的问题…

苹果iOS16曝出新漏洞:飞行模式下依旧可连接网络

近日&#xff0c;网络安全研究人员发现iOS 16存在一种新的漏洞利用后持久化技术&#xff0c;即使受害者的苹果设备处于离线状态&#xff0c;也可以利用该技术悄无声息地访问该设备。 Jamf Threat Labs 的研究人员 Hu Ke 和 Nir Avraham 在与 The Hacker News 分享的一份报告中…

八、Linux下,grep/wc/管道符/echo/重定向符/tail如何使用?

1、grep命令 &#xff08;1&#xff09;主要用于文件 &#xff08;2&#xff09;主要作用是“通过关键字&#xff0c;过滤文件行” &#xff08;3&#xff09;示例&#xff1a; 2、wc命令 &#xff08;1&#xff09;统计文件的行数、单词数等 &#xff08;2&#xff09;示例…

开源数据库Mysql_DBA运维实战 (总结)

开源数据库Mysql_DBA运维实战 &#xff08;总结&#xff09; SQL语句都包含哪些类型 DDL DCL DML DQL Yum 安装MySQL的配置文件 配置文件&#xff1a;/etc/my.cnf日志目录&#xff1a;/var/log/mysqld.log错误日志&#xff1a;/var/log/mysql/error.log MySQL的主从切换 查看主…

Docker部署php运行环境(php-fpm+nginx)

前言 如果使用docker去部署一套php的运行环境&#xff0c;我们需要构建出nginx、php-fpm两个容器&#xff0c;nginx通过fast_cgi协议去转发php-fpm中的端口&#xff0c;从而实现web server的搭建&#xff0c;接下来以php的laravel框架为演示例子。 部署php-fpm 第一步 编写ph…

「UG/NX」Block UI 面收集器FaceCollector

✨博客主页何曾参静谧的博客📌文章专栏「UG/NX」BlockUI集合📚全部专栏「UG/NX」NX二次开发「UG/NX」BlockUI集合「VS」Visual Studio「QT」QT5程序设计「C/C+&#

Java虚拟机(JVM):引用计数算法

一、引言 我们学习了Java内存运行时区域的各个部分&#xff0c;其中程序计数器、虚拟机栈、本地方法栈3个区域随线程而生&#xff0c;随线程而灭。栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作。每一个栈帧中分配多少内存基本上是在类结构确定下来就已知的…

Eclipse使用插件时提示Plugin Error loading shared libraries

项目场景: 使用Eclipse的过程中,依赖openCONFIGURATOR插件进行新建项目时,弹出如下的错误: Plugin Error loading shared libraries 以及具体的信息为: Can’t find dependent libraries 这里我使用的插件为openCONFIGURATOR插件 问题描述 如上场景,提示缺少动态链接库…

Python - 协程基本使用详解【demo】

一. 前言 协程&#xff08;Coroutine&#xff09;是一种轻量级的线程&#xff0c;也被称为用户级线程或绿色线程。它是一种用户态的上下文切换方式&#xff0c;比内核态的线程切换更为轻量级&#xff0c;能够高效的支持大量并发操作。 2. 使用协程的好处 Python 中的协程是通…

外卖福利来了,以后都10元以下了,还有机会赚钱,你信吗

怎么实现的点外卖赚钱 在外卖返现平台抢单&#xff0c;用信用卡支付订单&#xff0c;上传好评返现 外卖返现平台是看订单金额&#xff0c;信用卡满减不计入其中&#xff0c;这样就有机会实现赚钱 外卖返现平台 用了半年多返现5000多了&#xff0c;也是一笔开支了 扫最后面的…

快递打单系统使用教程

旅游旺季游客太多怎么办&#xff1f; 相信不少景区特产店都有这种“甜蜜的困扰”。一方面游客多了&#xff0c;自然销售量见长&#xff0c;另一面人流多了&#xff0c;如何服务好顾客&#xff0c;也是特产店的一大难题。 客户询价&#xff0c;太忙没能第一时间回复&#xff1…

Linux15 消息队列 线程

目录 1、进程间通信IPC&#xff1a; 2、多线程 3、向消息队列中写入数据 4、从消息队列中读取数据 5、多线程&#xff1a; 6、将多线程的数据返回给主…

js实现瀑布流布局

jquery.masonry.min.js&#xff1a;https://download.csdn.net/download/weixin_45791806/88224671 jQeasing.js&#xff1a; https://download.csdn.net/download/weixin_45791806/88224673 jquery.lazyload.js这个js可以自己百度下载 直通车&#xff1a;https://download.csd…

【JAVA】我们该如何规避代码中可能出现的错误?(一)

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️初识JAVA】 文章目录 前言三种类型的异常异常处理JAVA内置异常类Exception 类的层次 前言 异常是程序中的一些错误&#xff0c;但并不是所有的错误都是异常&#xff0c;并且错误有时候是可以避免的&…

设计模式之中介者模式(Mediator)的C++实现

1、中介者模式的提出 在软件组件开发过程中&#xff0c;如果存在多个对象&#xff0c;且这些对象之间存在的相互交互的情况不是一一对应的情况&#xff0c;这种功能组件间的对象引用关系比较复杂&#xff0c;耦合度较高。如果有一些新的需求变化&#xff0c;则不易扩展。中介者…

好用的语音转文字免费app手机软件分享给你

嘿&#xff01;你有没有遇到过这样的情况&#xff1a;听到了一段精彩的演讲、访谈&#xff0c;但又不方便记录下来&#xff1f;或者&#xff0c;你是一个繁忙的职场人士&#xff0c;需要快速将会议内容转化为文字记录,又苦于手动转写花费时间太多&#xff1f;别担心&#xff0c…

使用Alien对.deb包与.rpm包相互转换

目录 1、切换到root 2、更新yum&#xff08;更新比较耗时&#xff0c;不更新没试行不&#xff0c;自行斟酌是否跳过这一步&#xff09; 3、卸载ibus 4、安装Alien及其依赖包 5、安装Alien 6、将.deb转换成.rpm包 7、安装RPM包 8、如果报错 9、将.rpm转换成.deb包 10、安…

白嫖怪小案例———用爬虫实现csdn免费下载资源搜寻

前言 众所周知&#xff0c;在csdn下载资源有很多都是要收费的&#xff0c;最常见的是要积分的 但是小编囊中羞涩&#xff0c;买不起VIP&#xff0c;也没有积分&#xff0c;而资源又要一个一个点进去才知道是不是免费的&#xff08;最爱0积分了&#xff0c;老白嫖怪了&#xff…

Egg.js构建一个stream流式接口服务

经常需要用到 stream 流式接口服务,比如&#xff1a;大文件下载、日志实时输出等等。本文将介绍如何使用Egg.js构建一个 stream 流式接口服务。 一、准备工作 目录结构&#xff1a; app//controllerindex.jstest.txttest.shindex.js 控制器test.txt 测试文件&#xff0c;最好…

vue3 injection报错 injection“xxx“ not found.

在封装CheckboxGroup组件的的时候&#xff0c;需要通过provide&#xff0c;代码如下&#xff1a; //父组件 <template><div class"envCheckBoxGroup"><slot></slot></div> </template> <script setup> import { provide …