力扣网C语言编程题:快慢指针来解决 “寻找重复数”

一. 简介

上一篇文章解决力扣网上"查找重复数"的题目,提供了两种思路:哈希表和二分法。文章如下:

力扣网C语言编程题:寻找重复数-CSDN博客

本文提供另外两种解决思路:快慢指针和位运算。

二. 力扣网C语言编程题:快慢指针来解决 "寻找重复数"

解题思路三:(快慢指针)

什么是快慢指针?

快慢指针(Fast and Slow Pointers)是一种在链表或数组中高效检测环、查找中点或特定位置的算法技巧。其核心思想是使用两个指针,一个移动速度快(快指针),另一个移动速度慢(慢指针),通过指针间的相对运动关系解决问题。

这个问题如何理解成检测链表环问题?

以上是 Deepseek的回答,我觉得比较容易理解。

为什么快慢指针能找到环的入口?

慢指针与快指针走的路线如下:

复制代码
慢指针路径:H → ... → E → ... → M
             |<-- a -->|<-- b -->|

快指针路径:H → ... → E → ... → M → (绕环 k 圈) → M
             |<-- a -->|<-- b -->|<---- k*c --->|
快慢指针具体方法:
  1. 首先,寻找快指针与慢指针的相遇点;

  2. 其次,慢指针从"链表头"开始走,快指针从相遇点开始走,两个指针会在环入口相遇(根据上面公式 a = k*c - b)。而环入口就是 重复数。

C语言实现如下:

复制代码
//快慢指针
int findDuplicate(int* nums, int numsSize){
    if((nums == NULL) || (numsSize <= 0)) {
        return -1;
    }
    
    int slow = nums[0];
    int fast = nums[0];
    //寻找慢指针与快指针的相遇点
    do{
        slow = nums[slow]; //慢指针走一步:slow = slow->next
        fast = nums[nums[fast]]; //快指针走两步:fast = fast->next->next
    }while(slow != fast);

    //寻找环的入口
    slow = nums[0]; //慢指针从头开始走
    while(slow != fast) {
        slow = nums[slow];//慢指针移动
        fast = nums[fast];//快指针移动
    }
    // 根据数学推导,两者将在环入口相遇:
    // -慢指针走了 a 步到达环入口
    // -快指针从相遇点走了 a = k*c-b 步,也到达环入口
    return slow;
}

可以看出,在第二步找环入口时,快指针也是走一步的步速,跟慢指针一样的步速。可以像下面这么理解:(其中,H表示链表头,E表示环入口,M表示相遇点)

复制代码
- 指针1从 H 出发,走 a 步到 E。
- 指针2从 M 出发,走 a = k*c - b 步:
  - 从 M 走 c - b 步到 E,
  - 再走 (k-1)*c 步(绕环 k-1 圈)回到 E。
最终两者在 E 相遇。

快慢指针方法的时间复杂度为O(n), 空间复杂度为O(1),满足题目要求。进阶要求,找到一种证明数组至少存在一个重复数字的方法,同时时间复杂度为O(n),这个方法也满足要求了。

相关推荐
我叫黑大帅4 分钟前
为什么map查找时间复杂度是O(1)?
后端·算法·面试
炽烈小老头29 分钟前
【每天学习一点算法 2026/04/20】除自身以外数组的乘积
学习·算法
skilllite作者1 小时前
AI agent 的 Assistant Auto LLM Routing 规划的思考
网络·人工智能·算法·rust·openclaw·agentskills
py有趣2 小时前
力扣热门100题之不同路径
算法·leetcode
_日拱一卒3 小时前
LeetCode:25K个一组翻转链表
算法·leetcode·链表
啊哦呃咦唔鱼3 小时前
LeetCodehot100-394 字符串解码
算法
小欣加油3 小时前
leetcode2078 两栋颜色不同且距离最远的房子
数据结构·c++·算法·leetcode·职场和发展
我真不是小鱼3 小时前
cpp刷题打卡记录30——轮转数组 & 螺旋矩阵 & 搜索二维矩阵II
数据结构·c++·算法·leetcode
三品吉他手会点灯4 小时前
STM32 VSCode 开发-C/C++的环境配置中,找不到C/C++: Edit Configurations选项
c语言·c++·vscode·stm32·单片机·嵌入式硬件·编辑器
逻辑驱动的ken5 小时前
Java高频面试考点场景题09
java·开发语言·数据库·算法·oracle·哈希算法·散列表