破解编码面试:两指针技术部分

破解编码面试:两指针技术部分

破解编码面试:第 3 部分 – 两指针技术

在本系列的第 2 部分中,我们讨论了滑动窗口模式,它有助于有效解决涉及连续子数组或子字符串的问题。在第 3 部分中,我们将探讨编码面试中的另一个基本模式:双指针技术。这种技术对于涉及数组、链表或字符串的问题特别有效,其中比较或配对元素是关键。

在我们开始之前,如果您正在寻找准备编码面试的综合指南,请考虑阅读《破解编码面试》,这是任何认真想在顶级科技公司找到工作的人的必备书籍。

两指针技术概述

双指针技术是一种简单但功能强大的方法,其中两个指针(或索引)用于迭代数据结构,通常以相反的方向或以不同的速度移动。此模式对于涉及以下问题特别有用:

配对元素搜索组合(例如两个数字相加为目标值)比较数组或列表两端的元素检测循环或回文

通过同时移动两个指针,这种方法减少了对嵌套循环的需求,将暴力解决方案转变为更高效的解决方案,时间复杂度低至o(n)。

何时使用两指针技术:

输入已排序(或可以排序)。您需要找到元素对(例如,加起来等于目标的数字对)。您需要检测或比较元素之间的属性(例如回文检查、链表循环)。问题可以分为两个子问题(比如从数组的两端搜索)。

两种指针方法的类型

1. 两个相反方向的指针

它是什么:两个指针从数组或列表的两端开始,向彼此移动并在中间相遇。

示例问题:给定一个排序数组,找到两个数字相加达到特定目标。

def two_sum_sorted(arr, target):    left, right = 0, len(arr) - 1    while left < right:        current_sum = arr[left] + arr[right]        if current_sum == target:            return [left, right]        elif current_sum < target:            left += 1  # move the left pointer to the right.        else:            right -= 1  # move the right pointer to the left.    return []  # return an empty list if no pair is found.

说明:

指针从数组的两端开始。如果指针处的两个元素之和小于目标,则将左指针向右移动(以增加总和)。如果总和较大,请将右指针向左移动(减少总和)。这将潜在的 o(n²) 强力搜索减少为 o(n)。

2. 两个指向同一方向的指针

它是什么:两个指针以相同的方向移动,但速度不同。这对于检测循环(例如链表中的循环)或查找序列中的特定条件等问题很有用。

示例问题:检测链表中的循环(floyd 龟兔赛跑算法)。

class listnode:    def __init__(self, value=0, next=none):        self.value = value        self.next = nextdef has_cycle(head):    slow, fast = head, head    while fast and fast.next:        slow = slow.next  # move slow pointer by 1 step.        fast = fast.next.next  # move fast pointer by 2 steps.        if slow == fast:            return true  # cycle detected.    return false  # no cycle detected.

说明:

慢指针每次移动一步,快指针移动两步。如果存在循环,快指针最终会追上慢指针。这将循环检测问题从 o(n²) 减少到 o(n)。

实现两个指针解决方案的步骤

初始化指针:通常,这涉及在开头启动一个指针,在结尾启动另一个指针(对于相反方向),或者同时在开头启动另一个指针(对于相同方向)。

定义条件:指针的移动取决于问题。根据解决方案的当前状态确定何时移动每个指针以及向哪个方向移动。

更新结果: 在每一步中,检查您正在优化的条件(例如求和、比较)。相应地更新结果。

停止条件:循环继续,直到两个指针相遇或交叉(相反方向),或者满足有效条件(相同方向)。

使用两指针技术的常见面试问题

1. 二和(排序数组)

问题:给定一个排序的整数数组,找到两个数字相加达到给定的目标。

解决方案:使用数组开头和结尾的两个指针,根据总和调整指针。

2. 盛水最多的容器

问题:给定一个高度数组,找到与 x 轴一起形成一个容器的两条线,使得该容器包含最多的水。

模式: 在数组的两端使用两个指针。将高度较小的指针向内移动以最大化区域。

3. 回文检查

问题:给定一个字符串,判断它是否是回文。

模式:使用两个指针,一个在字符串的开头,一个在字符串的末尾,在比较字符时向内移动。

def is_palindrome(s):    left, right = 0, len(s) - 1    while left < right:        if s[left] != s[right]:            return False  # Characters do not match.        left += 1        right -= 1    return True  # All characters matched, so it's a palindrome.

面试的两个技巧

从排序数组开始:对数组进行排序可以更轻松地实现两指针,特别是在像两个和这样的配对问题中。从比较的角度思考:无论是比较字符串中的字符还是数组中的元素,始终检查应该在什么条件下移动每个指针。使用暴力进行可视化: 首先考虑暴力解决方案,然后寻找两个指针可以利用的模式,以避免不必要的比较。仔细检查边界: 注意边缘情况,尤其是当指针相遇或重叠时。

结论

双指针技术是解决各种编码面试问题的高效方法,特别是那些涉及比较、配对或序列循环的问题。通过掌握这项技术以及滑动窗口模式,您将有能力处理许多面试场景。

在本系列的下一部分中,我们将探索编码面试中的另一个基本模式:快慢指针技术,这对于检测循环和查找中间元素特别有用。

敬请期待第 4 部分!

以上就是破解编码面试:两指针技术部分的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1493275.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
第九届 TCmeeting 的更新
上一篇 2025年12月19日 15:33:01
Javascript面试题讲解-异步行为
下一篇 2025年12月19日 15:33:16

相关推荐

  • 新手小白入局抖音直播带货,避坑指南与高效引流技巧揭秘

    新手小白入局抖音直播带货,避坑指南与高效引流技巧揭秘新手小白入局抖音直播带货,避坑指南与高效引流技巧揭秘新手小白入局抖音直播带货,避坑指南与高效引流技巧揭秘新手小白入局抖音直播带货,避坑指南与高效引流技巧揭秘

    1.新手做抖音直播带货能否成功,关键在于避开常见陷阱并掌握高效引流技巧;首先要明确自身定位,选择熟悉且擅长的领域,避免盲目跟风选品,确保产品有需求且竞争适中。2.最容易踩的坑包括盲目跟风选品、直播内容单调、引流方式单一和售后服务不到位,避免方法是精准选品、增强互动、多渠道引流并重视售后。3.高效引流…

    2026年9月28日 • 用户投稿
    000
  • 想将 AI 汽车保养工具与豆包联用了解保养知识?详细步骤​

    想将 AI 汽车保养工具与豆包联用了解保养知识?详细步骤​想将 AI 汽车保养工具与豆包联用了解保养知识?详细步骤​想将 AI 汽车保养工具与豆包联用了解保养知识?详细步骤​想将 AI 汽车保养工具与豆包联用了解保养知识?详细步骤​

    想将 ai 汽车保养工具与豆包联用了解保养知识,可以按照以下步骤操作:1. 明确需求,如日常保养周期、故障码解读等;2. 使用豆包查询通用保养知识,例如更换机油周期或刹车片判断方法;3. 利用 ai 汽车保养工具进行个性化分析,输入 vin 码或行驶数据获取专属建议;4. 结合两者使用技巧,如记录问…

    2026年9月28日 • 用户投稿
    000
  • 适用于Linux系统的cmd命令技巧与窍门

    适用于Linux系统的cmd命令技巧与窍门适用于Linux系统的cmd命令技巧与窍门适用于Linux系统的cmd命令技巧与窍门适用于Linux系统的cmd命令技巧与窍门

    在Linux系统中,命令行是一个非常强大和灵活的工具,可以帮助用户高效地完成各种操作。掌握一些常用的命令技巧和窍门,可以让用户更加熟练地利用命令行来管理文件、执行任务等。下面将介绍一些适用于Linux系统的cmd命令技巧与窍门,希望能够帮助大家更好地利用命令行工具。 列出目录下的文件和子目录使用ls…

    2026年9月28日 • 用户投稿
    000
  • MySQL 实现点餐系统的库存盘点功能

    MySQL 实现点餐系统的库存盘点功能MySQL 实现点餐系统的库存盘点功能MySQL 实现点餐系统的库存盘点功能MySQL 实现点餐系统的库存盘点功能

    MySQL 实现点餐系统的库存盘点功能 随着餐饮行业的不断发展,一种有效、高效的点餐系统已经成为餐厅经营的必要条件。而针对点餐系统的库存盘点功能的实现,MySQL 数据库是一种非常方便和高效的选择。 本文将介绍如何在 MySQL 数据库中实现点餐系统的库存盘点功能,以及具体的代码示例。 一、数据库设…

    2026年9月28日 • 用户投稿
    100
  • 如何解决OPPOReno4Pro忘记帐号密码的问题(忘记OPPO帐号密码?别担心)

    如何解决OPPOReno4Pro忘记帐号密码的问题(忘记OPPO帐号密码?别担心)如何解决OPPOReno4Pro忘记帐号密码的问题(忘记OPPO帐号密码?别担心)如何解决OPPOReno4Pro忘记帐号密码的问题(忘记OPPO帐号密码?别担心)如何解决OPPOReno4Pro忘记帐号密码的问题(忘记OPPO帐号密码?别担心)

    随着智能手机的普及,人们越来越多地依赖于手机中的各种应用和服务。而为了保护个人信息的安全,许多用户会设置帐号密码来锁定手机和各种应用程序。然而,有时候我们可能会忘记这些密码,尤其是当我们长时间不使用某个帐号时。本文将提供一些解决方案,以帮助那些遗忘opporeno4pro帐号密码的用户重新获得手机的…

    2026年9月28日 • 用户投稿
    000
  • 快速入门Flink (7) —— 小白都喜欢看的Flink流处理之DataSources和DataSinks

    快速入门Flink (7) —— 小白都喜欢看的Flink流处理之DataSources和DataSinks快速入门Flink (7) —— 小白都喜欢看的Flink流处理之DataSources和DataSinks快速入门Flink (7) —— 小白都喜欢看的Flink流处理之DataSources和DataSinks快速入门Flink (7) —— 小白都喜欢看的Flink流处理之DataSources和DataSinks

    不知不觉,这已经是快速入门flink系列的第7篇博客了。早在第4篇博客中,博主就已经为大家介绍了在批处理中,数据输入data sources 与数据输出data sinks的各种分类(传送门:flink批处理的datasources和datasinks)。但是大家是否还记得flink的概念?flin…

    2026年9月28日 • 用户投稿
    100
  • Excel表格怎么给数据自动排序_Excel表格数据排序操作方法

    Excel表格怎么给数据自动排序_Excel表格数据排序操作方法Excel表格怎么给数据自动排序_Excel表格数据排序操作方法Excel表格怎么给数据自动排序_Excel表格数据排序操作方法Excel表格怎么给数据自动排序_Excel表格数据排序操作方法

    选中数据区域后通过“数据”选项卡进行升序或降序操作,可快速完成基础排序;若需多条件排序,应打开排序对话框设置多个关键字;为实现自动排序效果,可将数据转为表格或使用辅助列结合RANK函数,真正实时排序则需VBA宏。注意避免仅选单列以防错位。 在Excel中对数据进行自动排序,能快速整理信息,提升工作效…

    2026年9月28日 • 用户投稿
    000
  • 谷歌浏览器任务管理器有什么用_谷歌浏览器任务管理器功能与使用

    答案:通过谷歌浏览器任务管理器可监控资源使用、结束卡顿进程、管理扩展消耗及快速切换标签页。具体包括查看各进程内存、CPU和网络占用,按列排序定位高负载项;选中异常页面或扩展后点击“结束进程”恢复响应;检查扩展程序资源占用并跳转至设置调整;双击任务管理器中的标签行直接切换页面,提升操作效率。 如果您发…

    2026年9月28日
    100
  • 《绝地潜兵2》登陆Xbox后 全平台在线峰值超50万

    《绝地潜兵2》登陆Xbox后 全平台在线峰值超50万《绝地潜兵2》登陆Xbox后 全平台在线峰值超50万《绝地潜兵2》登陆Xbox后 全平台在线峰值超50万《绝地潜兵2》登陆Xbox后 全平台在线峰值超50万

    《绝地潜兵2》捷报频传。本作于8月26日正式登陆xbox series平台,并同步推出与《光环》的联动活动,多重利好因素共同推动了游戏玩家数量与销量的显著增长。 《绝地潜兵2》全平台同时在线玩家突破50万 据游戏官方数据显示,在登陆Xbox平台后,《绝地潜兵2》的同时在线人数迅速攀升,峰值一度超过5…

    2026年9月28日 • 用户投稿
    000
  • sublime怎么设置成单例模式只打开一个窗口_单窗口模式设置方法

    sublime怎么设置成单例模式只打开一个窗口_单窗口模式设置方法sublime怎么设置成单例模式只打开一个窗口_单窗口模式设置方法sublime怎么设置成单例模式只打开一个窗口_单窗口模式设置方法sublime怎么设置成单例模式只打开一个窗口_单窗口模式设置方法

    Sublime Text 设置单窗口模式需修改用户配置文件,添加 “close_windows_when_empty”: true 和 “open_files_in_new_window”: false,确保文件在现有窗口打开且无文件时关闭窗口。该设置…

    2026年9月28日 • 用户投稿
    000
  • qq浏览器收藏的网页打不开了 QQ浏览器收藏夹失效链接处理方法

    qq浏览器收藏的网页打不开了 QQ浏览器收藏夹失效链接处理方法qq浏览器收藏的网页打不开了 QQ浏览器收藏夹失效链接处理方法qq浏览器收藏的网页打不开了 QQ浏览器收藏夹失效链接处理方法qq浏览器收藏的网页打不开了 QQ浏览器收藏夹失效链接处理方法

    首先检查网络连接是否正常,再尝试刷新页面;若仍无法加载,清除QQ浏览器缓存并更新应用;最后验证网站是否可用,必要时重新添加有效链接。 如果您尝试打开QQ浏览器中收藏的网页,但页面无法加载或提示链接失效,可能是由于网络问题、缓存异常或目标网站状态变化所致。以下是解决此问题的具体步骤: 本文运行环境:i…

    2026年9月28日 • 用户投稿
    100
  • 使用 Java Map 聚合 List 中重复元素的数值

    使用 Java Map 聚合 List 中重复元素的数值使用 Java Map 聚合 List 中重复元素的数值使用 Java Map 聚合 List 中重复元素的数值使用 Java Map 聚合 List 中重复元素的数值

    本文介绍了如何使用 Java Map 结构有效地聚合 List 中具有相同类型(Type)的元素的数值,例如金额(Amount)和数量(Quantity)。通过将 List 转换为 Map,并利用 compute 方法或 Stream API 的 toMap 操作,可以避免手动循环和比较,从而简化代…

    2026年9月28日 • 用户投稿
    000
  • 了解Linux Deploy的原理与应用领域

    了解Linux Deploy的原理与应用领域了解Linux Deploy的原理与应用领域了解Linux Deploy的原理与应用领域了解Linux Deploy的原理与应用领域

    标题:探寻Linux Deploy的原理与应用领域 Linux Deploy 是一款开源的应用程序,可以帮助用户在Android设备上部署和运行Linux系统。它的原理是通过虚拟化技术在Android系统中创建一个独立的Linux环境,用户可以在其中运行各种Linux发行版,如Ubuntu、Debi…

    2026年9月28日 • 用户投稿
    000
  • Yii框架中的数据提取:从不同数据源获取数据

    随着互联网的迅猛发展,数据已经成为了企业发展的重要资源。为了更好地利用数据,我们需要将数据从不同的数据源中提取出来进行分析和处理。在这篇文章中,我们将重点介绍如何在yii框架中从不同的数据源中获取数据。 一、从MySQL数据库中提取数据 MySQL是目前最流行的关系型数据库之一,它的安装和使用非常简…

    用户投稿 2026年9月28日
    000
  • 抖音中视频原创开关在哪打开?抖音原创功能开启步骤

    抖音作为一个广受欢迎的短视频平台,不仅为用户提供了分享生活和展现自我的机会,还非常注重原创内容的保护。今天,我们将带您深入了解抖音视频原创开关的使用方法,帮助您轻松开启原创保护功能,让您的创意在抖音平台上大放异彩! 一、如何在抖音中打开视频原创开关? 1. 启动抖音APP,点击右上角的“我”,进入个…

    2026年9月28日
    000
  • PHP实时输出如何实现长连接保活_PHP实时输出长连接保活机制

    答案:PHP通过关闭输出缓冲、强制刷新、禁用代理缓存及定期发送数据实现长连接保活。具体包括使用ob_end_flush()、flush()、set_time_limit(0),配合sleep()输出心跳字符,调整Nginx/Apache超时设置,并建议前端用SSE或轮询处理断线重连。适用于低并发伪实…

    2026年9月28日
    000
  • 溯回青空新手怎么开荒 溯回青空前期推图阵容搭配建议

    溯回青空新手怎么开荒 溯回青空前期推图阵容搭配建议溯回青空新手怎么开荒 溯回青空前期推图阵容搭配建议溯回青空新手怎么开荒 溯回青空前期推图阵容搭配建议溯回青空新手怎么开荒 溯回青空前期推图阵容搭配建议

    刚开始接触《溯回青空》的玩家可能会对前期如何快速起步感到困惑,但其实只要理清思路,开荒过程非常顺畅。首要任务是专注推进主线剧情,这不仅能快速解锁抽卡、自动战斗等关键系统,还能通过低难度关卡积累初期资源。主线关卡设计较为友好,即使使用初始的一星或二星角色也能轻松过关。战斗中建议先部署一名低费角色吸引火…

    2026年9月28日 • 用户投稿
    000
  • Mac如何退出安全模式_Mac安全模式启动与退出方法

    Mac如何退出安全模式_Mac安全模式启动与退出方法Mac如何退出安全模式_Mac安全模式启动与退出方法Mac如何退出安全模式_Mac安全模式启动与退出方法Mac如何退出安全模式_Mac安全模式启动与退出方法

    首先通过常规重启退出安全模式,若无效则强制中断安全模式启动流程,最后可尝试重置NVRAM/PRAM恢复默认启动设置。 如果您在使用Mac时发现系统启动后显示“安全模式”提示,这通常意味着系统正在进行磁盘检查或缓存清理,可能影响部分功能的正常使用。以下是退出安全模式的操作步骤: 本文运行环境:MacB…

    2026年9月28日 • 用户投稿
    000
  • Java编程:计算用户输入字符串的词汇属性百分比

    Java编程:计算用户输入字符串的词汇属性百分比Java编程:计算用户输入字符串的词汇属性百分比Java编程:计算用户输入字符串的词汇属性百分比Java编程:计算用户输入字符串的词汇属性百分比

    本教程详细介绍了如何在Java中接收用户输入字符串,并利用正则表达式计算符合特定词汇属性(如纯字母单词、首字母大写单词)的字符串百分比。文章涵盖了输入验证、数据存储、正则表达式匹配以及模块化计数方法,旨在提供一个清晰、高效的解决方案。 1. 教程概述与核心挑战 在许多应用场景中,我们需要从用户那里获…

    2026年9月28日 • 用户投稿
    000
  • 搜狗输入法回应被指“暗中篡改浏览器配置”:测试功能异常导致,已修复

    搜狗输入法回应被指“暗中篡改浏览器配置”:测试功能异常导致,已修复搜狗输入法回应被指“暗中篡改浏览器配置”:测试功能异常导致,已修复搜狗输入法回应被指“暗中篡改浏览器配置”:测试功能异常导致,已修复搜狗输入法回应被指“暗中篡改浏览器配置”:测试功能异常导致,已修复

    针对被安全软件公司指控“暗中”篡改浏览器配置,搜狗输入法今日正式作出官方回应。 近日,我们关注到有关搜狗输入法“存在病毒漏洞”的不实信息。经核查,该问题源于一项尚未正式发布的测试功能,由于测试配置异常导致外部可访问。发现问题后,我们已于第一时间(9月20日)完成修复,不会对用户的实际使用造成影响。对…

    2026年9月28日 • 用户投稿
    000

发表回复

登录后才能评论
关注微信