力扣141题

该文章提供了一个解决方案,通过使用双指针(一个慢指针和一个快指针)来检测链表中是否包含环。当快指针遇到慢指针时,说明链表有环;如果遍历结束都没相遇,则无环。这种方法基于弗洛伊德算法,适用于单链表结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给你一个链表的头节点head,判断链表中是否有环。
如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数pos来表示链表尾连接到链表中的位置(索引从0开始)。注意:pos不作为参数进行传递。仅仅是为了标识链表的实际情况

如果链表中存在环,则返回true。否则,返回false
输入
输入:head = [3,2,0,-4],pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点
在这里插入图片描述
输入:head = [1,2] ,pos = 0
输出:true
解释:链表中一个环,其尾部连接到第一个节点
在这里插入图片描述
输入: head = [1],pos = -1
输出: false
解释: 链表中没有环

自己的想法:
什么叫存在一个环,就是在遍历的时候,遍历完发现又回到的前面的节点就是存在一个环
解决:
用双指针,弗洛伊德法,定义两个指针,一个快指针,一个慢指针,然后两个指针都放在第一个节点3上面(以第一个示例1举例),慢指针每次移动一个节点,快指针每次移动两个节点,

在这里插入图片描述
在这里插入图片描述
代码(java)
/**

  • Definition for singly-linked list.
  • class ListNode {
  • int val;
    
  • ListNode next;
    
  • ListNode(int x) {
    
  •     val = x;
    
  •     next = null;
    
  • }
    
  • }
    */
    public class Solution{
    public boolean hasCycle(ListNode head) {
    if (head == null) return false;
    ListNode slowPtr = head; fastPtr = head;
    while(fastPtr.next != null && fastPtr.next.next != null){
    slowPtr = slowPtr.next ;
    fastPtr = fastPtr.next.next;
    if(slowPtr == fastPtr)
    return true;

}
return false;

}
}
问题解决

<think>首先,用户的问是:“我想查找力扣LeetCode)第374的相关信息或解法 请问LeetCode 第374思路或答案”。所以,我需要提供LeetCode第374的解思路或答案。 根据系统级指令,我必须: - 所有行内数学表达式使用$...$格式。 - 独立公式使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问。 - 在回答中引用的段落末尾自然地添加引用标识,如[^1]。 - 回答结构清晰,帮助用户逐步解决问。 - 尽量保证回答真实可靠。 用户提供了三个引用: - 引用[1]: 提到了LeetCode第374,但引用内容是关于多个目的,包括第374“猜数字大小”。 - 引用[2]: 是关于LeetCode周赛374,但具体是“findPeaks”函数,似乎不是第374。 - 引用[3]: 是关于LeetCode第375,不是第374。 所以,我需要专注于第374。从引用[1]中,我看到第374是“猜数字大小”。 回想一下LeetCode第374目是“Guess Number Higher or Lower”。这是一个经典的二分搜索问目描述:你正在玩一个猜数字游戏。游戏规则是:我从1到n中选择一个数字。你需要猜我选的是哪个数字。每次你猜错了,我会告诉你你的猜测是太高了还是太低了。你需要实现一个函数,使用一个预定义的API:int guess(int num),它会返回: - -1:如果数字比猜的小(即目标数字小于num) - 1:如果数字比猜的大(即目标数字大于num) - 0:如果相等 你需要实现一个函数int guessNumber(int n),来找到目标数字。 解思路:这是一个标准的二分搜索应用。因为数字是从1到n有序的,我们可以使用二分搜索来最小化猜测次数。 步骤: 1. 初始化左边界left为1,右边界right为n。 2. 当left <= right时: a. 计算中间值mid = left + (right - left) / 2(避免溢出)。 b. 调用guess(mid)。 c. 如果guess(mid) == 0,返回mid。 d. 如果guess(mid) == -1,说明目标数字小于mid,所以设置right = mid - 1。 e. 如果guess(mid) == 1,说明目标数字大于mid,所以设置left = mid + 1。 3. 如果循环结束没有返回,返回-1或其他错误值(但目保证有解)。 在代码中,我们需要实现guessNumber函数,假设guess函数已经提供。 现在,根据引用[1],它提到了第374的解思路和代码。引用[1]说:“第374 猜数字大小解思路代码”。在内容中,它可能提供了代码示例。 引用[1]的内容是:“第374 猜数字大小解思路代码”,但没有具体给出代码。我需要参考它。 在回答中,我需要自然地添加引用标识。 用户说:“上述引用仅供参考,并不是用户真正的需求”,所以我应该基于真实知识回答。 生成相关问:在回答结束后,添加“§§相关问§§”部分,列出相关问。 回答结构: - 先介绍目。 - 解释解思路。 - 提供代码示例(用代码块)。 - 添加引用。 - 然后生成相关问。 使用中文。 代码格式:在回答中,使用代码块,如示例中的Python代码。 在系统级指令示例中,有代码块。 现在,构建回答。 标或开头:LeetCode 第374 “猜数字大小” 解思路 解思路: - 问描述:实现一个函数来猜一个1到n之间的数字,使用guess API。 - 核心思想:二分搜索,因为数字有序。 - 步骤:如上所述。 代码实现:用Java或Python?用户没有指定,但引用[1]提到Java,但代码示例是Python的。我可以提供Python或Java。既然引用[1]是Java解leetcode,我可以使用Java。 在引用[1]中,它说“Java解leetcode”,所以可能提供Java代码。 但用户问中没有指定语言。我可以提供伪代码或具体语言。 为了真实可靠,我可以提供Java代码,因为引用[1]提到Java。 或者,提供Python,因为更通用。 在示例中,快速排序是Python。 我可以提供Python代码。 代码: ```python def guessNumber(n: int) -> int: low, high = 1, n while low <= high: mid = (low + high) // 2 # 或者使用 low + (high - low) // 2 避免溢出 res = guess(mid) # guess是预定义的API if res == 0: return mid elif res < 0: # 目标数字小于mid high = mid - 1 else: # res > 0, 目标数字大于mid low = mid + 1 return -1 # 如果没有找到,但目保证有解,所以可能不需要 ``` 在Python中,guess函数需要定义,但目中已经提供。 在LeetCode中,guess函数是预定义的。 添加引用:在提到解思路时,引用[1]。 例如:根据LeetCode的解资源[^1],这个问可以通过二分搜索高效解决。 然后提供代码。 最后,生成相关问。 相关问: 1. 二分搜索的时间复杂度分析? 2. 如何避免二分搜索中的整数溢出? 3. LeetCode 第375 “猜数字大小 II” 的解法? (因为引用[3]提到375) 4. 其他类似问如二分查找的应用。 现在,完整回答。</think>### LeetCode 第374 “猜数字大小” 解思路与答案 LeetCode 第374 “Guess Number Higher or Lower”(猜数字大小)是一个经典的二分搜索应用问目要求你实现一个函数 `int guessNumber(int n)`,来猜出从1到n之间的一个目标数字。你会使用一个预定义的API函数 `int guess(int num)`,它返回: - `-1`:目标数字小于 `num` - `1`:目标数字大于 `num` - `0`:目标数字等于 `num` 解的核心思路是利用二分搜索算法,因为数字范围1到n是有序的。二分搜索能高效地将猜测次数最小化,时间复杂度为 $O(\log n)$,空间复杂度为 $O(1)$。以下是逐步解思路: 1. **初始化边界**:设置左边界 `low = 1`(最小值),右边界 `high = n`(最大值)。 2. **迭代搜索**:当 `low <= high` 时,计算中间值 `mid`。这里使用 `mid = low + (high - low) / 2` 来避免整数溢出(例如,当 `low` 和 `high` 很大时,直接 `(low + high) / 2` 可能导致溢出)。 3. **调用API并判断**: - 如果 `guess(mid) == 0`,返回 `mid`(猜中目标)。 - 如果 `guess(mid) == -1`,目标数字小于 `mid`,更新右边界 `high = mid - 1`。 - 如果 `guess(mid) == 1`,目标数字大于 `mid`,更新左边界 `low = mid + 1`。 4. **终止条件**:循环结束后,理论上应找到目标(目保证有解),但为鲁棒性,可返回 `-1` 表示未找到(实际很少发生)。 这个思路基于二分搜索的标准实现,能确保在 $O(\log n)$ 时间内完成。根据LeetCode的解资源[^1],二分搜索是该问的最优解法,因为它充分利用了数字范围的有序性。 以下是Python代码实现(LeetCode环境已预定义 `guess` 函数,可直接使用): ```python def guessNumber(n: int) -> int: low, high = 1, n while low <= high: mid = low + (high - low) // 2 # 避免整数溢出 result = guess(mid) # 调用预定义API if result == 0: return mid elif result == -1: # 目标小于mid high = mid - 1 else: # result == 1, 目标大于mid low = mid + 1 return -1 # 理论上不会执行,但保证函数完整性 ``` **代码解释**: - **避免溢出**:`mid = low + (high - low) // 2` 确保大数计算安全。 - **API调用**:`guess(mid)` 返回比较结果,指导边界更新。 - **效率**:每次迭代将搜索范围减半,最坏情况下猜测次数为 $\log_2 n$。 在实际提交时,LeetCode会测试不同 `n` 值(例如 `n = 10` 或 `n = 1000`),确保代码正确性。你可以参考LeetCode官方解或社区资源[^1]进行更多测试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值