当前位置: 首页 > ai >正文

力扣HOT100之技巧:287. 寻找重复数


这道题真的是中等题吗?我请问呢??我怎么觉得是困难题呢?
这道题的思路太难想了,想不出来,直接去看的这位大佬的题解,写得很清楚。
这道题可以将其转化为环形链表问题,可是为什么只要存在重复元素,按照i -> nums[i]的映射方式一定能构成环呢?以下是我的思考:

  1. 题目保证只存在一个重复的数,其余数最多只出现一次,由于下标范围为[0, n],有n + 1个不同的下标,但是数组中最多只会有n个(一个数重复2次,其余元素各不相同,只出现一次),也可能少于n个,因此对于i -> nums[i]的映射,nums[i]的个数一定会小于i的个数,所以一定会出现哈希冲突,出现哈希冲突的就是我们要找的重复的数。
  2. 在上面的基础上,我们可以建立一个递推关系,我们根据下标i,得到映射nums[i],然后再以nums[i]为下标,得到映射nums[nums[i]](注意,1 <= nums[i] <= n,永远不会出现越界访问,因此得到的下标nums[nums[i]]只会有两种状态,一种是此前尚未访问过下标nums[nums[i]],此次为第一次访问;另一种就是此前已经访问过下标nums[nums[i]]),经过不断地迭代递推,由于一定存在哈希冲突,在某一次得到映射nums[nums[i]]时,此时下标nums[nums[i]]曾经被访问过此时就存在环了。
  3. 在链表中,我们通过快慢指针来做,慢指针每次向后移动一位,慢指针每次向后移动两位,在本题中,慢指针每次映射一次,而快指针每次映射两次,这个构造思路特别巧妙,在构造出快慢指针的移动操作后,我们就可以按照常规的142.环形链表Ⅱ来做了,具体的思路可以看下我这篇博客。
    下面是代码
class Solution {
public:int findDuplicate(vector<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]];}//再定义一个慢指针int slow1 = 0;while(slow1 != slow){slow1 = nums[slow1];slow = nums[slow];}return slow;}
};

这道题是力扣hot100的最后一道,刷完这道题还给了个勋章,唉,终于坚持下来了。

http://www.xdnf.cn/news/13660.html

相关文章:

  • 安装配置以太链钱包工具
  • 好用的培训教务管理系统哪个用的最多?
  • 68元开启智能硬件新纪元——明远智睿SSD2351开发板引领创新浪潮
  • java_api路径_@Parameter与@RequestParam区别
  • 【hadoop】疫情离线分析案例
  • 关于使用EasyExcel、 Vue3实现导入导出功能
  • 系统功耗管理
  • 25年春招:米哈游运维开发一面总结
  • Java反射机制深度解析与实战应用
  • C# net8生成excel,并设置列规则导出文件
  • 【Linux】Linux基础I/O
  • 织梦dedecms内容页调用seotitle标题的写法
  • Python训练营---DAY52
  • day01 ——Java基础入门
  • 135. Candy
  • C# 界面检测显示器移除并在可用显示器上显示
  • 关键领域软件测试新范式:如何在安全合规前提下提升效率?
  • 14.FTP传输分析
  • 云安全【阿里云ECS攻防】
  • 解决office各种疑难杂症
  • HarmonyOS运动开发:深度解析文件预览的正确姿势
  • win11系统部署tomcat10教程
  • 详解docker挂载目录常用方式
  • flutter把 pubspec.yaml 中的name改成了新的值
  • window 显示驱动开发-为视频处理创建渲染目标图面
  • 使用 React+Vite+Electron 搭建桌面应用
  • 【机器学习】Teacher-Student框架
  • 佰力博与你探讨表面电阻测试的一些方法和测试应用场景
  • 前端面试七之列表渲染和组件重用
  • 新加坡金融管理局责令未获许可加密货币公司于6月30日前退出,Bitget、Bybit考虑撤离