【技巧】Leetcode 287. 寻找重复数【中等】

news2024/11/27 22:20:48

寻找重复数

给定一个包含 n + 1 个整数的数组 nums ,其数字都在 [1, n] 范围内(包括 1 和 n),可知至少存在一个重复的整数。

假设 nums 只有 一个重复的整数 ,返回 这个重复的数

你设计的解决方案必须 不修改 数组 nums 且只用常量级 O(1) 的额外空间。

示例1:

输入:nums = [1,3,4,2,2]
输出:2

解题思路

如何将输入的数组看作为链表?如果能转化成链表,则可以使用 Leetcode 142. 环形链表 II的思想,找到环的起点即可。

可以使用数学函数思想,定义一个f(x)函数

输入为:

  • [1,3,4,2]
    则有函数的映射关系 x->f(x)为:
  • 0->1
  • 1->3
  • 2->4
  • 3->2
  • 我们从下标为 0 出发,根据 f(x)计算结果值为(类似高中函数定义,令发y=f(x),有x值和y值对应,这里就是x从0开始,数组元素作为y和x组成对应关系,即函数):
  • 0->1->3->2->4->null

那如果数组有重复元素,假设数组为:

  • [1,3,4,2,2]

对应f(x)函数一定会产生多对一的映射(即有2个即以上的x对应一个y值)
对应到链表上,则如下:
其映射关系 x->f(x) 为:

  • 0->1
  • 1->3
  • 2->4
  • 3->2
  • 4->2
    同样的,我们从下标为 x= 0 出发,根据 f(x) 计算出一个值,以这个值为新的下标,再用这个函数计算,以此类推产生一个类似链表一样的序列。
    0->1->3->2->4->2->4->2->……
    在这里插入图片描述
    可以发现,环的起点4即为重复元素。使用Leetcode 142. 环形链表 II思想即可解题。

java实现

public class FindDuplicate {
    public int findDuplicate(int[] nums) {
        int slow = nums[0];
        int fast = nums[0];

        // Phase 1: 检测是否存在循环,可能在环中的某个点相遇
        //有重复元素一定存在环
        do {
            //对应f(x)的函数关系,相当于链表的slow = slow.next
            slow = nums[slow];
            //对应f(x)的函数关系 相当于链表fast = fast.next.next
            fast = nums[nums[fast]];
        } while (slow != fast);

        // Phase 2: 找到循环的入口
        //因为相遇点到环的入口的距离与数组起点到环的入口的距离相等
        //数组起点到环的入口的距离a 一个一步a+b,一个两步,
        // a+c=2(a+b) 因为相遇a=c-2b 即两步走的那个距离环的入口一定多走了a
        fast = nums[0];
        while (slow != fast) {
            slow = nums[slow];
            fast = nums[fast];
        }

        return slow;
    }

    public static void main(String[] args) {
        FindDuplicate solution = new FindDuplicate();
        //0->1->4->2->3
        //      ^     |
        //      |     |
        //      ------
        int[] nums = {1, 4, 3, 4, 2,5};
        int result = solution.findDuplicate(nums);
        System.out.println("The duplicate number is: " + result);
    }
}

时间空间复杂度

  • 时间复杂度为O(n)。
  • 空间复杂度为O(1)。

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

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

相关文章

搜维尔科技:Manus Prime 3 Mocap数据手套,体验极致的每指触觉!

完全适用于VR虚拟现实场景 特斯拉也在使用的量子数据 Tesla 目前正在使用 MANUS Quantum Metagloves创建一个数据集,帮助他们训练 Tesla 机器人。 量子数据训练QUANTUM AI 我们以类似的方式使用 Quantum Metagloves 来生成一流的手指跟踪数据集,并将其…

yolov5目标检测可视化界面pyside6源码(无登录版)

一、软件简介: 这是基于yolov5-7.0目标检测实现的的可视化目标检测源码 本套项目没有用户登录的功能,如需用户登录版,看另一篇文章:yolov5pyside6登录用户管理目标检测可视化源码_yolov5用户登入功能-CSDN博客 ①程序中图片和图标…

护眼台灯怎么选看哪些指标?护眼灯十大品牌推荐

在追求高效工作与学习的同时,如何保护视力健康,避免长时间用眼带来的疲劳与伤害,已成为现代人关注的焦点。护眼台灯作为提升用眼环境的重要工具,其选择显得尤为关键。那么,面对市面上琳琅满目的护眼台灯产品&#xff0…

分治dp,LeetCode 894. 所有可能的真二叉树

目录 一、题目 1、题目描述 2、接口描述 ​cpp python3 3、原题链接 二、解题报告 1、思路分析 F1 回溯 F2 动态规划 2、复杂度 3、代码详解 ​分治 cpp python3 dp cpp python3 一、题目 1、题目描述 给你一个整数 n ,请你找出所有可能含 n 个节…

数学矩阵(详解)

矩阵乘法 知阵乘法是《线性代数》中的基础内容,但在考察数学的算法题中也会出现。 本节我们学习基础的矩阵乘法规则。 每个矩阵会有一个行数和一个列数,只有当相乘的两个矩阵的左矩阵的列数等于右矩阵的行数 时,才能相乘,否则不允…

蓝桥杯单片机速成2-动态数码管数码管显示

一、原理图 段选给1是选中 ,该数码管是共阳极的数码管,位选输入0才会电亮一位 二、代码分析 /************* 本地常量声明 **************/ u8 code t_display[]{ //标准字库 // 0 1 2 3 4 5 6 7 8…

Java复习第十五天学习笔记(JS),附有道云笔记链接

一、JS简介 JS: 1、直接嵌入HTML页面。 2、由浏览器解释执行代码,不进行预编译。 解释型语言和编译型语言 JS:解释型语言、弱类型语言 Java:编译型语言、强类型语言 变量: var num 100; variable 用var来定义一个变量。 int num 1…

kubernetes(K8S)学习(九):K8S之日志监控

K8S之日志监控 一、Log and Monitor1.1 Log1.1.1 容器级别1.1.2 Pod级别1.1.3 组件服务级别1.1.4 LogPilot ES Kibana 1.2 Monitor1.2.1 Prometheus简介1.2.2 Prometheus架构1.2.3 Prometheus知识普及1.2.4 数据采集1.2.5 Prometheus Grafana 二、Trouble Shooting&#xff…

ARM64架构栈帧以及帧指针FP

文章目录 前言一、arm64架构寄存器简介1.1 异常等级1.2 通用寄存器1.3 ARM64架构ABI 二、ARM64架构函数调用标准2.1 AArch64过程调用标准简介2.2 通用寄存器中的参数 三、demo分析3.1 main函数3.2 funb3.3 funa 四、栈帧总结五、demo演示参考资料 前言 这篇文章描述了 x86_64架…

原生小程序开发性能优化指南

性能优化指南 1.骨架屏 业务可以在数据加载完成之前用骨架屏幕来占位,提升体验。 2.包大小优化 减小包中静态资源,例如图片文件,可将图片进行压缩降低文件体积。无用文件、函数、样式剔除。除了部分用于容错的图片必须放在代码包&#xf…

3.docker容器相关命令

docker容器相关命令 容器是根据镜像创建的 docker images 1.查看容器 docker ps docker ps -a #查看所有容器 2.创建容器 docker run -itd --name XXX nginx /bin/bash docker run -it -name xxxxx centos:7 参数:-i :一直运行着 -t : 给容器分配一个终端…

CentOS7安装DockerCompose

1.CentOS7安装DockerCompose 1.1.下载 Linux下需要通过命令下载: # 安装 curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-uname -s-uname -m > /usr/local/bin/docker-compose1.2.修改文件权限 修改文件权限&#xff1a…

汽车电子行业知识:什么是数字钥匙?

文章目录 1. 什么是数字钥匙?2. 数字钥匙有哪些类型?3. 汽车数字钥匙4. 数字钥匙包含哪些技术5. 汽车数字钥匙的发展趋势 1. 什么是数字钥匙? 数字钥匙通常指的是一种安全工具,它使用数字代码或密码来授权对特定系统或服务的访问。…

练习 13 Web [极客大挑战 2019]Secret File

php伪协议请求&#xff0c;php代码审计 参考&#xff1a;BUUCTF__[极客大挑战 2019]Secret File_题解 没有任何上传和登录页面 查看前端源码 发现 <a id"master" href"./Archive_room.php" style"background-color:#000000;height:70px;width:20…

Linux中间件(nginx搭建、LNMP服务搭建)

目录 一、安装nginx 第一步、下载nginx的压缩包到Linux中 ​第二步、安装依赖 第三步&#xff1a;安装 nginx 第四步&#xff1a;启动nginx 第五步&#xff1a;测试nginx 二、 nginx的配置文件 nginx.conf文件内容解读 案例&#xff1a;发布多个网站 二、lamp/lnmp …

springcloud基本使用二(远程调用)

创建两个springboot maven子项目 子项目名称分别为order-server和user-server 配置user-server子项目: 所需依赖: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependenc…

如何用Git在终端以可视化的方式查看提交情况

2024年4月2日&#xff0c;周二上午 要使用 Git 查看树状提交情况&#xff0c;可以使用 git log 命令的 --graph 选项。这个选项会以树状图的形式显示提交历史&#xff0c;清晰地展示每个提交的分支合并情况和分支间的关系。 git log --graph 除了 --graph 选项外&#xff0c;还…

算法学习——LeetCode力扣动态规划篇1(509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯、62. 不同路径、63. 不同路径 II)

算法学习——LeetCode力扣动态规划篇1 509. 斐波那契数 509. 斐波那契数 - 力扣&#xff08;LeetCode&#xff09; 描述 斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项…

Mac - Keychron K3 Pro 功能键改键 -via 改键配置 For Mac

前言 Keychron K3 Pro键盘连接Mac使用&#xff0c;顶部一排功能键&#xff0c;默认是Mac的多媒体功能键。F1&#xff5e;F12功能键&#xff0c;需要按&#xff1a;Fn F1&#xff5e;F12。 而在我的日常工作中&#xff0c;常用的是F1&#xff5e;F12&#xff0c;期望F1~F12功…

SwiftUI Swift 显示隐藏系统顶部状态栏

Show me the code // // TestHideSystemTopBar.swift // pandabill // // Created by 朱洪苇 on 2024/4/1. //import SwiftUIstruct TestHideSystemTopBar: View {State private var isStatusBarHidden falsevar body: some View {Button {withAnimation {self.isStatusBa…