Java刷题笔记13:寻找重复数

本文介绍了如何使用快慢指针和Floyd判圈法解决LeetCode中寻找数组中重复数字的问题。当给定一个包含n+1个1到n的整数数组,利用数组构造链表模拟并寻找链表环的入口,从而找到重复的数字。
摘要由CSDN通过智能技术生成

寻找重复数

题目描述

给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。

示例

示例1:

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

示例2:

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

  • 不能更改原数组(假设数组是只读的)。
  • 只能使用额外的 O(1) 的空间。
  • 时间复杂度小于 O(n2) 。
  • 数组中只有一个重复的数字,但它可能不止重复出现一次

快慢指针

若是没有规定只能使用O(1)的时间那么这题很容易,使用哈希表可以完美解决,且最坏时间复杂度仅为O(n)。但为了满足题目的要求那就只能另寻它法了。
仔细看了一下题目,发现题目给的数组很特殊。它只有n+1个数,但是包括了1~n的所有整数。有经验的同学可能看出来了,这种数组是可以模拟链表的。把数组内的元素当做下一个元素的坐标,也就是说数组内的元素相当于next指针。如示例1中的数组就可以模拟如下链表:
在这里插入图片描述
上图中由于下标2->下标4,下标3和下标4均指

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值