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

寻找重复数

给定一个包含 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)。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2013年认证杯SPSSPRO杯数学建模C题(第二阶段)公路运输业对于国内生产总值的影响分析全过程文档及程序

2013年认证杯SPSSPRO杯数学建模 C题 公路运输业对于国内生产总值的影响分析 原题再现: 交通运输作为国民经济的载体,沟通生产和消费,在经济发展中扮演着极其重要的角色。纵观几百年来交通运输与经济发展的相互关系,生产水平越高…

中国90米分辨率可蚀性因子K数据

土壤可蚀性因子(K)数据,基于多种土壤属性数据计算,所用数据包括土壤黏粒含量(%)、粉粒含量(%)、砂粒含量(%)、土壤有机碳含量(g/kg)、…

计算机组成原理1:计算机系统概述

此系列介绍计算机的组成原理,参考书:《计算机组成原理考研复习指导》(王道论坛组编)。 1.计算机发展史 1.1 计算机发展 计算机变化 第一代计算机 ( 1946 − 1957 ) (1946-1957) (1946−1957):电子管时代。 逻辑元件采用电子管;使…

LVS、HAProxy

集群:将很多个机器组织到一起,作为一个整体对外提供服务。集群在扩展性、性能方面都可以做到很灵活。集群的分类:负载均衡集群:Load Balance。高可用集群:High Available。高性能集群:High Performance Com…

酷开系统覆盖尽可能多的用户,助力酷开科技走在数字化营销前面

用户画像可看作企业应用大数据的根基,是定向广告投放与个性化推荐的前置条件,为数据驱动运营奠定了基础。酷开系统家庭激活终端超过6000万,针对全量用户进行分析,覆盖尽可能多的用户,为提升用户画像准确率提供了很好的…

GWO-CNN-BiLSTM多输入回归预测|灰狼群算法优化的卷积-双向长短期神经网络|Matlab

目录 一、程序及算法内容介绍: 基本内容: 亮点与优势: 二、实际运行效果: 三、算法介绍: 四、完整程序下载: 一、程序及算法内容介绍: 基本内容: 本代码基于Matlab平台编译&…

谷歌翻译示例

概述 项目需要,使用谷歌翻译,前提是得翻墙。 1、获取所有语言和其对应编码如下所示: {auto: 检测语言,sq: 阿尔巴尼亚语,ar: 阿拉伯语,am: 阿姆哈拉语,as: 阿萨姆语,az: 阿塞拜疆语,ee: 埃维语,ay: 艾马拉语,ga: 爱尔兰语,et: 爱沙尼亚语,or…

主站设备通过Modbus转Profinet网关与湿度传感器通讯配置

Modbus转Profinet网关(XD-MDPN100)可以实现不同协议设备通讯,有些现场需要实时监测环境参数,但大由于当时环境仪表设备不能达到直连效果,通过Modbus转Profinet网关,湿度传感器的数据可以被准确、可靠地传输…

三十个中文AI对话网站推荐

目录 写在前面 一、kimi 二、WeexAI 三、Cursor 四、智谱清言 五、讯飞星火 六、通义千问 七、文心一言 八、混元 九、豆包AI 十、其它 写在前面 总的来说,现在国内能用到的大模型类产品分国产和套壳两种。对于中文任务,这些大模型功能都大同…

文献学习-25-综合学习和适应性教学:用于病理性胶质瘤分级的多模态知识蒸馏

Comprehensive learning and adaptive teaching: Distilling multi-modal knowledge for pathological glioma grading Authors: Xiaohan Xing , Meilu Zhu , Zhen Chen , Yixuan Yuan Source: Medical Image Analysis 91 (2024) 102990 Key words: 知识蒸馏、模态缺失、胶质瘤…

C++ vector 动态 向量/数组

文章目录 【 1. vector 的声明与初始化 】1.1 vector 的声明1.2 vector 的初始化1.2.1 构造一个空的 vector1.2.2 指定数量初值的方式初始化 vector1.2.3 迭代器的方式初始化1.2.4 构造一个相同的 vector 【 2. vector 的相关操作 】2.1 插入元素2.1.1 在vector的末尾插入新元素…

ios 之 netty版本swiftNio(socket创建)

SwiftNio 简介 用于高性能协议服务器和客户端的事件驱动、无阻塞的网络应用程序框架。 SwiftNIO是一个跨平台异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。 这就像Netty,但是为Swift写的。 Xcode引入swiftNio 在实…

【Linux】常见命令

⭐ 作者:小胡_不糊涂 🌱 作者主页:小胡_不糊涂的个人主页 💖 持续更文,关注博主少走弯路,谢谢大家支持 💖 常用命令 1. ls2. pwd3. cd4. touch5. cat6. mkdir7. rm8. cp9. mv10. tail11. vim12.…

idea使用docker将Java项目生成镜像并使用

1:开启docker 远程访问 使用 vim 编辑docker服务配置文件 vim /lib/systemd/system/docker.service [Service] Typenotify # the default is not to use systemd for cgroups because the delegate issues still # exists and systemd currently does not suppor…

2024-04-02 在使用QtRemoteObject 过程中遇到的问题记录

前言 QtRemoteObject 的使用分为静态和动态使用,静态使用需要定义rep文件,相当于通信协议,保证源端和节点端类型的统一。 这些可以参考这两文章: https://zhuanlan.zhihu.com/p/36501814 https://zhuanlan.zhihu.com/p/3710817…

校园圈子系统-论坛,跑腿,地图找伴,二手市场,语音交友,APP小程序H5三端源码交付,支持二开!

2024年最新版推荐一个论坛社区系统 /社区论坛小程序/商城论坛小程序/源码。 带热门,带算法推荐 ,低成本上线的,论坛社区小程序源码强大售后,持续更新 功能:小程序授权登陆,支持app双端,小程序,…

qt5-入门-自定义委托-简单例子

参考: Qt 自定义委托_w3cschool https://www.w3cschool.cn/learnroadqt/ov8h1j4z.html C GUI Programming with Qt 4, Second Edition 本地环境: win10专业版,64位,Qt 5.12 理论知识 Qt的model/view架构中,view只是…

FastAPI Web框架教程 第14章 部署

14-1 在Linux上安装Python 【环境】 腾讯云服务器 Centos 8 【安装方式】 源码编译安装 安装步骤: 第1步:更新yum源 cd /etc/yum.repos.d/ sed -i s/mirrorlist/#mirrorlist/g /etc/yum.repos.d/CentOS-* sed -i s|#baseurlhttp://mirror.centos.…

RESTful的优点

优点 1.通过url对资源定位,语义清晰; 2.通过HTTP谓词表示不同的操作,接口自描述; 3.可以对GET、PUT、DELETE请求重试(幂等的); 4.可以对GET请求做缓存; 5.通过HTTP状态码反映服务器端…

【数据结构】AVL 树

文章目录 1. AVL 树的概念2. AVL 树节点的定义3. AVL 树的插入4. AVL 树的旋转5. AVL 树的验证6. AVL 树的删除7. AVL 树的性能 前面对 map / multimap / set / multiset 进行了简单的介绍【C】map & set,在其文档介绍中发现,这几个容器有个共同点是…