从零学算法287

news2024/12/27 10:35:12

287.给定一个包含 n + 1 个整数的数组 nums ,其数字都在 [1, n] 范围内(包括 1 和 n),可知至少存在一个重复的整数。
假设 nums 只有 一个重复的整数 ,返回 这个重复的数 。
你设计的解决方案必须 不修改 数组 nums 且只用常量级 O(1) 的额外空间。
示例 1:
输入:nums = [1,3,4,2,2]
输出:2
示例 2:
输入:nums = [3,1,3,4,2]
输出:3
示例 3 :
输入:nums = [3,3,3,3,3]
输出:3
提示:
1 <= n <= 10^5
nums.length == n + 1
1 <= nums[i] <= n
nums 中 只有一个整数 出现 两次或多次 ,其余整数均只出现 一次
进阶:
如何证明 nums 中至少存在一个重复的数字?
你可以设计一个线性级时间复杂度 O(n) 的解决方案吗?

  • 为了只使用 O(1) 的额外空间,我们借用原数组的空间做标记,找到结果后复原数组。具体思路如下:由于数组中的数都小于数组长度 n+1,所以每个 nums[i] 都能对应一个数组下标,比如 nums[0]=3,我们令其指向数组下标为 3 的地方,将 nums[3] 标记为负数,这就表示数组中存在一个数为 3,若所有数不重复,那么最后每个 nums[i] 都会指向对应的位置且位置不重复;而如果存在重复的数就会有:要标记时被标记数已为负数
  •   public int findDuplicate(int[] nums) {
          int res = nums[0];
          for(int n:nums){
          	// 因为这个位置上的数可能被标记为负数,所以取绝对值
              int a = Math.abs(n);
              // 将对应位置上的数标记为负数
              if(nums[a]>0)nums[a]=-nums[a];
              // 否则说明已经标记过了,此时 a 为结果
              else res = a;
          }
          // 复原
          for(int i=0;i<nums.length;i++){
              nums[i]=Math.abs(nums[i]);
          }
          return res;
      }
    
  • 他人题解:把数组看做环形链表,上面说了每个 nums[i] 都能对应一个数组下标,那么就把 nums[i] 看做下一个节点的下标,我们把数组下标与值一一对应,可以得到类似链表的结构,例如[1,3,4,2,2]我们可以得到:
  • 0 -> 1
    1 -> 3
    2 -> 4
    3 -> 2
    4 -> 2

  • 我们从下标 0 开始,根据 nums[0] 得到一个值 n,然后从这个值继续,以他为下标,可以得到 nums[n],他就是新的 n,然后继续得到 nums[n]…
  • 也就是说上面例子可以看做 0->1->3->2->4->2->4->2->…,其中的 2->4 为一个循环,可以看做如下链表请添加图片描述
  • 由于有重复的数,所以一定会产生多对一的映射,并且因为 nums[i] 的范围为 [1,n],而数组长度为 n+1,所以不可能导致链表中断,一定会得到环。
  • 举个不符合规则的测试用例 [1,3,2,4],会得到链表 0->1->3->4->null,这里就是没有 nums[4] 所以链表中断了,但是实际上 nums[i] 的范围被限制为 [1,3],所以不会出现这个例子的情况
  • 那么最后本题中找到重复的数就被我们转化为了找到环的入口,因为只有重复的数才能满足环的起点和终点一样的特点
  • 接下来分析怎么得到环的入口,使用快慢指针,首先当两个点相遇时,能相遇的原因就是快指针进行了无用功,比如跑了一个环的长度回到了原地,所以被慢指针追上了,设环长度为 m,慢指针走了 x 步,那么快指针和它相遇肯定是走了 x+ym 步(y=1,2,3…,表示比慢指针多跑了 y 圈环的长度)。那么两点第一次相遇时,慢指针步数为 x,快指针步数为 x+m,这个 x 是多少步?因为快指针的速度是慢指针的两倍,所以快指针步数 x+m 等于慢指针步数 x 的两倍 => x+m=x+x => x=m,也就是说快慢指针第一次相遇时慢指针走了 m 步,设相遇点离环起点 n 步,环起点离原点就有 m-n 步,同时,从相遇点继续走到环起点也需要 m-n 步,那么此时就让慢指针回到原点,快指针开始一步一步走,最后经过 m-n 步,两个指针就同时到达了环起点请添加图片描述
  • 如上图的例子,两点会在环的长度也就是第四个点处第一次相遇,此时快指针再走三步到环起点,慢指针也是走三步到环起点
  •   public int findDuplicate(int[] nums) {
          int slow = 0,fast = 0;
          // 初始走一下,不然直接相等了
          slow = nums[slow];
          fast = nums[nums[fast]];
          // 第一次相遇时停止
          while(slow != fast){
              slow = nums[slow];
              fast = nums[nums[fast]];
          }
          // slow 回原点
          slow = 0;
          // 共同走 m-n 步在环起点相遇
          while(slow != fast){
              slow = nums[slow];
              fast = nums[fast];
          }
          return slow;
      }
    

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

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

相关文章

数字电子技术笔记——组合逻辑功能

1.Adder&#xff08;加法器&#xff09; Half-Adder&#xff08;半加器&#xff09; Full-Adder&#xff08;全加器&#xff09; 74LS283(4-bit parallel adders) carry look-ahead adder &#xff08;超前进位加法器&#xff09; 2.Comparator&#xff08;比较器&#xff09;…

基于Python3的数据结构与算法 - 14 队列

目录 一、定义 1. 环形队列 2. 自定义队列 二、队列的内置模块 1. 双向队列 一、定义 队列&#xff08;Queue&#xff09;是一个数据集合&#xff0c;仅允许在列表的一端进行插入&#xff0c;另一端进行删除。进行插入的一端称为队尾&#xff08;rear&#xff09;&#…

python请求url下载网站中的视频

举例网站&#xff1a;Mini Impresora Trmica Bluetooth Porttil Inalmbrico | Envo gratis ctrlF4 先搜mp4 搜不到就搜m3u8 了 视频格式如下 &#xff08; AVI&#xff08;Audio Video Interleave&#xff09;&#xff1a;是一种由微软公司开发的音频和视频文件格式。MOV&…

02_electron快速建立项目

一、安装 yarn 在此之前可以先安装 git&#xff1a;Git - Downloads (git-scm.com) 下面就是 yarn 安装的代码&#xff0c;在终端输入即可。 npm install --global yarn 检查是否安装成功&#xff1a; yarn --version 二、快速建立一个electron项目 其实在Getting Started - …

【HarmonyOS】鸿蒙开发之工具安装与工程项目简介——第1章

鸿蒙开发工具包下载与使用 鸿蒙开发工具包下载 下载deveco studio开发工具包 系统要求: Windows 操作系统&#xff1a;Windows 10/11 64 位 内存&#xff1a;8GB 及以上 硬盘&#xff1a;100GB 及以上 分辨率&#xff1a;1280*800 像素及以上macOS 操作系统&#xff1a;mac…

【rk3229 android7.1.2 替换默认输入法】

问题平台描述 问题描述解决方法 郑重声明:本人原创博文&#xff0c;都是实战&#xff0c;均经过实际项目验证出货的 转载请标明出处:攻城狮2015 Platform: Rockchip CPU:rk3229 OS:Android 7.1.2 Kernel: 3.10 问题描述 国内客户&#xff0c;觉得安卓自带的输入法不好用&#x…

LeetCode刷题---每月交易I

LeetCode官方题解 解题思想&#xff1a; 首先按照日期和国家/地区进行分组 对分组后的结果求解&#xff0c;使用IF函数进行过滤 涉及函数 1.在对日期截取时&#xff0c;使用了MySQL中的DATE_FORMAT函数&#xff0c;将日期转换为指定格式的日期 //2024-03-11,截取为 2024-03-…

【数据可视化】数据可视化入门前的了解

个人主页 &#xff1a; zxctscl 如有转载请先通知 文章目录 1. 前言2. 数据可视化概述2.1 数据可视化的定义及特性2.1.1 数据可视化的定义2.1.2 特性 2.2 数据中蕴含的信息2.3 数据可视化的作用2.3.1 模式2.3.2 关系2.3.3 异常 3. 数据可视化流程4. 数据可视化工具4.1 ECharts4…

如何在Linux部署FastDFS文件服务并实现无公网IP远程访问内网文件——“cpolar内网穿透”

文章目录 前言1. 本地搭建FastDFS文件系统1.1 环境安装1.2 安装libfastcommon1.3 安装FastDFS1.4 配置Tracker1.5 配置Storage1.6 测试上传下载1.7 与Nginx整合1.8 安装Nginx1.9 配置Nginx 2. 局域网测试访问FastDFS3. 安装cpolar内网穿透4. 配置公网访问地址5. 固定公网地址5.…

记录一下某外资的面试

文章目录 标题English introduction标题What did u do in this gap time标题What’S the big challenge in your work experience标题 4、介绍一个自己熟悉的项目或最近的项目&#xff0c;包括项目的背景&#xff0c;使用的技术&#xff0c;在里面的角色标题5、项目中有多少个微…

力扣--深度优先算法/回溯算法78.子集

思路分析&#xff1a; 首先&#xff0c;定义了一个类 Solution&#xff0c;其中包含一个成员变量 result 用于存储最终的所有子集。在类中定义了一个私有成员函数 dfs&#xff0c;用于执行深度优先搜索&#xff0c;生成所有可能的子集。主函数 subsets 初始化结果&#xff0c;…

Vue2(4)——iHRM组织架构

组织架构-树组件应用 树形组件-用层级结构展示信息&#xff0c;可展开或折叠。 属性设置 data(绑定数据)props(设置属性)- children(设置子节点的字段名)/ label(设置显示内容的字段名)default-expand-all(默认展开所有节点) 组织架构-树组件自定义结构 显示右侧结构 节点结…

个人商城系统开源(配置支付宝支付!)

原文地址&#xff1a;个人商城系统开源&#xff08;配置支付宝支付&#xff01;&#xff09; - Pleasure的博客 下面是正文内容&#xff1a; 前言 由于近期实在没有什么话题可写和一些有趣的项目教程可以分享。所以我只能决定将我自己亲手编写的一个迷你迷你商城系统进行开源…

npm install报错,error <https://npm.community>解决方法

报错信息如下&#xff1a; 分析原因&#xff1a; 1.可能是由于node版本过低&#xff0c;或者过高,解决方法看我另一文章&#xff1a;npm install报错&#xff0c;npm版本过高&#xff0c;需要切换低版本node&#xff0c;过程记录 2.网络问题导致 3.切换node版本后&#xff0…

Material UI 5 学习03-Text Field文本输入框

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 Text Field文本输入框 一、最基本的本文输入框1、基础示例2、一些表单属性3、验证 二、多行文本 一、最基本的本文输入框 1、基础示例 import {Box, TextField} from "…

Linux第76步_“gpio子系统”下的LED驱动

使用新字符设备驱动的一般模板和“gpio子系统”&#xff0c;以及设备树&#xff0c;驱动LED。 1、添加“gpio_led”节点 打开虚拟机上“VSCode”&#xff0c;点击“文件”&#xff0c;点击“打开文件夹”&#xff0c;点击“zgq”&#xff0c;点击“linux”&#xff0c;点击“…

LLM - 大语言模型的自注意力(Self-Attention)机制基础 概述

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/136623432 注意力(Attention)机制是大型语言模型中的一个重要组成部分&#xff0c;帮助模型决定在处理信息时&#xff0c;所应该关注的部…

后端八股笔记------微服务篇

注册中心的主要作用&#xff1a;根据服务进行负载均衡&#xff0c;服务的健康监控。 服务雪崩&#xff0c;因为一个服务D的宕机&#xff0c;导致很多服务崩掉。 达到失败阈值----Closed_to_Open 服务降级------某一个接口 服务熔断------整个服务 限流常见的算法可以是令牌…

代理IP如何应对自动化测试和爬虫检测

目录 一、代理IP在自动化测试和爬虫中的作用 二、代理IP的优缺点分析 1.优点 2.缺点 三、应对自动化测试和爬虫检测的策略 1.选择合适的代理IP 2.设置合理的请求频率和间隔 3.模拟人类行为模式 4.结合其他技术手段 四、案例与代码示例 五、总结 在自动化测试和爬虫开…

Docker笔记-进入运行中的镜像,查看日志等操作

docker搭建好后&#xff0c;查看运行的docker镜像&#xff1a; docker ps -a 进入运行的容器&#xff0c;命令如下&#xff1a; docker exec -it <容器ID> /bin/bash # 或者&#xff0c;直接用容器里面的命令&#xff0c;比如mysql镜像 docker exec -it <容器ID>…