面试常考:成环法的应用--寻找环的起点得到重复的数字

Posted C_YCBX Py_YYDS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试常考:成环法的应用--寻找环的起点得到重复的数字相关的知识,希望对你有一定的参考价值。

题目

在这里插入图片描述

做这题之前需要了解的题目

leetcode142题成环链表II

原理是通过快慢指针判断是否有环,然后通过距离关系,从头同步遍历找到起点。

解题代码

class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        //只需要判断fast指针是否null就行,毕竟在最前面
        ListNode* slow = head;
        ListNode* fast = head;
        //在环内相交,然后通过距离关系,得到环的起点
       while(fast&&fast->next){
                slow = slow->next;
                fast = fast->next->next;
                if(slow==fast)
                    goto end;
                
       }//用goto区别有环和无环
        return nullptr;
        end:
        slow = head;
            while(slow!=fast){
                //通过距离关系,同步运行得到交点
                slow = slow->next;
                fast = fast->next;
            }
            return slow;
       
    }
};

题目解析

这次我就偷个懒,给个链接给你们看看大佬的解析。
这题难就难在要实现O(n)时间复杂度的同时还要求O(1)的空间复杂度。

此题能将数组作为链表处理而且一旦出现重复元素就能成环的原因:因为是给定n+1个元素,元素的数据范围在1~n,并且只存在一个重复的元素值(该值可为多次)

大佬详解

解题代码

class Solution {
public:
//代码风格几乎和链表那题惊人的一致,只是这个不需要考虑边界问题,所以直接可以走步
    int findDuplicate(vector<int>& nums) {
        int slow = 0,fast = 0;
        //走一步 和 走两步
        slow = nums[slow]; fast = nums[nums[fast]];
        //不用考虑边界问题的快乐hhh,直接可以判断是否相等
        while(slow!=fast){
            slow = nums[slow];
            fast = nums[nums[fast]];
        }//更改慢指针,同步找起点
        slow = 0;
        while(slow!=fast){
            slow = nums[slow];
            fast = nums[fast];
        }
    return slow;
    }
};

以上是关于面试常考:成环法的应用--寻找环的起点得到重复的数字的主要内容,如果未能解决你的问题,请参考以下文章

面试常考算法题(考察单调队列)--滑动窗口的最大值

百度前端常考vue面试题(附答案)

初中数学常考的最短路径13种模型,都给你准备好了,请查收!

Java常考面试题

LeetCode面试常考题目

Leetcode——寻找重复数