LeetCode刷题之HOT100之寻找重复数

news2024/11/16 7:29:30

2024 7/8 热热热热热热·,昨晚空调开定时,4点被热醒,全身发烫,后背湿的透透的,胶粘,起来又开了一小时,早上继续被二次热醒。看来还是得整晚开。做题啦!

1、题目描述

在这里插入图片描述

2、算法分析

寻找重复数。只能使用常数级空间O(1)。本来第一时间想到是用哈希表存储,但这样就不符合O(1)空间复杂度的要求。那么,该如何求解呢?想了几分钟,想不出来。看题解先。
如果数组中有重复的数,以数组 [1,3,4,2,2] 为例,我们将数组下标 n 和数 nums[n] 建立一个映射关系 f(n)
其映射关系 n->f(n) 为:
0->1
1->3
2->4
3->2
4->2
同样的,我们从下标为 0 出发,根据 f(n) 计算出一个值,以这个值为新的下标,再用这个函数计算,以此类推产生一个类似链表一样的序列。

0->1->3->2->4->2->4->2->……

这里 2->4 是一个循环,那么这个链表可以抽象为下图:
在这里插入图片描述
如果有重复数,就会产生环,那么那个环的入口元素就是我们要找的重复数。

这题正好和142题、环形链表类似,这里我贴过来:环形链表Ⅱ

3、代码

 public int findDuplicate(int[] nums) {
        // 初始化快慢指针 
        int slow = 0;
        int fast = 0;
        // 快慢指针开始移动,快指针每次移动两步,慢指针每次移动一步
        // 慢指针移动到下个位置
        // 快指针移动到下下个位置
        slow = nums[slow];
        fast = nums[nums[fast]];
        // 当快慢指针不相遇时,继续移动
        while(slow != fast){
            // 慢指针继续移动
            slow = nums[slow];
            // 快指针继续以两倍速度移动
            fast = nums[nums[fast]];
        }

        // 快慢指针相遇,表示找到了环的入口  
        // 此时,将其中一个指针重置到数组的起始位置(0),然后两个指针以相同速度移动  
        // 它们将在环的入口再次相遇 
        
        // 第一个指针(或者叫“寻找环入口的指针”)
        int pre1 = 0;
        // 第二个指针(此时与快指针相遇的慢指针)
        int pre2 = slow;
        // 两个指针同时移动,直到它们再次相遇
        while(pre1 != pre2){
            pre1 = nums[pre1];
            pre2 = nums[pre2];
        }
        // 当两个指针再次相遇时,它们相遇的位置就是环的入口,也就是我们要找的重复数字  
        // 因为所有数字都是1到n之间的,而数组长度是n+1,所以环的入口必然是重复的数字
        return pre1;
    }

4、复杂度分析

  • 时间复杂度:O(n)。「Floyd 判圈算法」时间复杂度为线性的时间复杂度。
  • 空间复杂度:O(1)。我们只需要常数空间存放若干变量。

okok,再见啦!

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

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

相关文章

扩散模型笔记2

Ref:扩散模型的原理及实现(Pytorch) 在扩散模型中,每一步添加的噪声并不是完全一样的。具体来说,噪声的添加方式和量在每一步是根据特定的规则或公式变化的。这里我们详细解释每一步添加噪声的过程。 正向过程中的噪声添加&…

flask、fastapi在服务器制作接口携参访问返回参数

flask创建接口: 一、安装python 官网下载Download Python | Python.org 二、安装flask 在选择的文件夹路径cmd调用bash安装 pip install Flask三、创建flask应用 # app.py from flask import Flask, request, jsonify app Flask(__name__) app.route(/ech…

【国产开源可视化引擎Meta2d.js】标尺

画布顶部和左边的坐标标尺 在线体验: 乐吾乐2D可视化 示例: // 设置默认缺省标尺属性 meta2d.store.options.rule true; // 开启 meta2d.store.options.ruleColor eeeeee; // 标尺颜色, 可缺省// 设置单个图纸的标尺属性 //方式1 meta2d.…

Kafka(二)Producer第一篇

一,Client开发 生产逻辑需要具备以下几个 步骤: (1)配置生产者客户端参数及创建相应的生产者实例。 (2)构建待发送的消息。 (3)发送消息。 (4)关闭生产者实例…

材料科学SCI期刊,IF=6+,2个月录用,审稿速度非常快

一、期刊名称 Journal of Materials Research and Technology 二、期刊简介概况 期刊类型:SCI 学科领域:材料科学 影响因子:6.2 中科院分区:2区 三、期刊简介 《材料研究与技术杂志》为发表与材料加工、性能和性能相关的理论…

蚓链实践告诉你“企业确保达成数字化营销效果的方法”

在如今这个数字化盛行的时代,企业想在激烈的市场竞争里崭露头角,确保数字营销效果那可是至关重要!今天就来给大家聊聊实现这一目标的基本条件,来自蚓链数字化营销系统的广大用户体验总结。 一、精准的目标定位 企业一定要清楚地知…

Java 操作 Redis客户端

目录 1.渐进式遍历 2.Java 操作 Redis 客户端 2.1 引入依赖 2.2 配置端口转发 2.3 连接Redis Server 3.基础操作 3.1 set 和 get 3.2 exists 和 del 3.3 keys 3.4 expire 和 ttl 3.5 type 4.字符串操作 4.1 mget 和 mset 4.2 append 4.3 getrange 和 setrange 4.4 incr 和 d…

如何大幅减少 Vue.js 中的包大小和加载时间,提升用户体验!

大家好,我是CodeQi! 一位热衷于技术分享的码仔。 你知道吗,根据Google 的一项研究,如果网站加载时间超过 3 秒,53% 的移动用户会离开该网站? 性能优化是一个经常讨论的话题,但很多开发人员并不关心提高应用的速度。 在前端开发中,优化包大小和加载时间对于提升用户体…

数据结构--二叉树相关题2(OJ)

1.比较对称二叉树(镜像二叉树) 二叉树相关题1中第二题的变形题。先去看1哦! 左子树和右子树比较 bool _isSymmetric(struct TreeNode* p, struct TreeNode* q) {if (p NULL && q NULL)return true;//如果两个都为空则是相等的if …

【Arduino】XIAOFEIYU(TM)实验ESP32使用霍尔传感器(图文)

霍尔传感器是一种可以测量磁力变化的传感器,今天XIAOFEIYU就来测试一下ESP32使用霍尔传感器。 霍尔传感器:正负极加一个数据接口。 将传感器与ESP32进行电路连接: 编写程序: #define SIGNAL_PIN 33int value 0; // 存储传感…

【Spring Boot】关系映射开发(二):一对多映射

《JPA 从入门到精通》系列包含以下文章: Java 持久层 API:JPA认识 JPA 的接口JPA 的查询方式基于 JPA 开发的文章管理系统(CRUD)关系映射开发(一):一对一映射关系映射开发(二&#…

如何在Spring Boot中实现分布式任务调度?

文章目录 引言一、分布式任务调度的基本原理二、Spring Boot与分布式任务调度1. 使用Quartz实现分布式任务调度2. 使用Elastic-Job实现分布式任务调度 三、常见问题与解决方案结论 🎉欢迎来到SpringBoot框架学习专栏~ ☆* o(≧▽≦)o *☆嗨~我是IT陈寒🍹…

食品行业制氮机的应用范围解析

在食品行业中,保障食品的品质和安全性是每一个企业所追求的核心目标。制氮机作为一种重要的辅助设备,其在食品行业中的作用不容忽视。 一、保障食品质量与安全性 制氮机通过物理方法从空气中分离出高纯度氮气,为食品提供了一个无氧环境。这一…

C++模板元编程(二)——完美转发

完美转发指的是函数模板可以将自己的参数“完美”地转发给内部调用的其它函数。所谓完美,即不仅能准确地转发参数的值,还能保证被转发参数的左、右值属性不变。 文章目录 场景旧的方法新的方法内部实现参考文献 场景 思考下面的代码: templ…

哈喽GPT-4o,程序员如何通过GPT-4o提高工作效率

目录 一、编写代码Prompt:请用Java语言编写一个二分查找的样例 二、修正代码错误、代码优化Prompt:我们上传一张华为OD算法题的题目描述,再给它我的Java解题代码,问问它有什么问题? 三、解读代码功能、代码翻译Prompt&…

Qt 网络编程 网络信息获取操作

学习目标:网络信息获取操作 前置环境 运行环境:qt creator 4.12 学习内容 一、Qt 网络编程基础 Qt 直接提供了网络编程模块,包括基于 TCP/IP 的客户端和服务器相关类,如 QTcpSocket/QTcpServer 和 QUdpSocket,以及实现 HTTP、FTP 等协议的高级类,如 QNetworkRe…

flask缓存、信号的使用

【 一 】flask-ache ​ 它为 Flask 应用程序提供了缓存支持。缓存是 Web 应用程序中非常常见的做法,用于存储频繁访问但不太可能经常更改的数据,以减少对数据库或其他慢速存储系统的访问,从而提高应用程序的性能和响应速度。 ​ Flask-Cach…

程序员必知的 89 个操作系统核心概念

1. 操作系统(Operating System,OS):是管理计算机硬件与软件资源的系统软件,同时也是计算机系统的内核与基石。操作系统需要处理管理与配置内存、决定系统资源供需的优先次序、控制输入与输出设备、操作网络与管理文件系…

Stable Diffusion 【模型推荐】没有最强,只有更强!高清画质!电影光效版SD1.5人像摄影大模型《他和她 2》

今天带来了一款SD1.5大模型——《他和她 2》电影光效版SD1.5人像摄影大模型。该模型经过家叔马丁Mr_M大佬的优化升级后,把SD1.5的影像光效推上了全新的高度!根据大佬的描述,该模型具有更强大的细节表现,更细腻的表面肌理&#xff…

揭秘SmartEDA:电路仿真软件如何贯穿课前课中课后,助力电子学习新纪元!

在电子设计与自动化的学习道路上,一款强大的电路仿真软件往往能为学生们带来事半功倍的效果。今天,我们就来深入探讨一下SmartEDA这款电路仿真软件在课前、课中、课后的全方位应用,看看它如何助力我们的电子学习步入新纪元! 1、课…