”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 二指针算法解释

二指针算法解释

发布于2024-11-08
浏览:992

Two pointers algorithm explained

我想解释一个简单有效的技巧,你可以在面试中处理数组、字符串、链表等时使用它。这也将提高你对这些数据的基础知识结构。

让我们从理论开始。该算法有两个常见用例:

  • left/right 该算法的中心概念是有两个整数变量,它们将从字符串或数组的两侧移动。通常,人们称之为左和右。左边将从0索引移动到长度-1,右边则相反。

  • 慢/快 指针以相同方向运行,例如,从开始到结束,但一个指针比另一个指针运行得更快。在这种情况下,人们通常称变量为慢速和快速。

算法是基本的,理解它们的最好方法是研究一些例子。

首先我们来看一个左右指针的情况。这是我们可以使用该算法解决的问题的基本示例。目标很明确:我们想要找到一对总和等于给定数字的对。
暴力方法会产生嵌套循环,但使用它通过面试的机会很低。
更好的方法是使用两个指针算法并在一个循环中找到它以具有 O(n) 复杂度而不是 O(n²)


const findPair = (arr, target) => {
    let left = 0;                 // Start with two pointers left from start, right, from the end
    let right = arr.length - 1;

    while (left 

让我们切换到指针具有不同速度的方法。这是一个常见的问题,你可以在面试中遇到。您需要找到给定链接列表的中间位置。
蛮力方法并不像前面的例子那么糟糕,但面试官期望有更好的方法。
使用两个指针算法,您将以 O(n) 复杂度解决此问题,而如果您使用两个顺序循环,暴力方法将需要 O(2n)。


class ListNode {
    constructor(value) {
        this.value = value;
        this.next = null;
    }
}

const findMiddle = (head) => {
    if (!head) return null;

    let slow = head;
    let fast = head;

    while (fast && fast.next) {
        slow = slow.next;           // Move slow pointer one step
        fast = fast.next.next;      // Move fast pointer two steps
    }

    return slow;  // Slow pointer will be at the middle
}

// Creating a linked list 1 -> 2 -> 3 -> 4 -> 5
const head = new ListNode(1);
const node2 = new ListNode(2);
const node3 = new ListNode(3);
const node4 = new ListNode(4);
const node5 = new ListNode(5);

head.next = node2;
node2.next = node3;
node3.next = node4;
node4.next = node5;

findMiddle(head).value);  // Output: 3 (middle node)


版本声明 本文转载于:https://dev.to/okaz/two-pointers-algorithm-explained-3k0e?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何使用自定义语句扩展 Python 语法?
    如何使用自定义语句扩展 Python 语法?
    向 Python 语法添加新语句Python 的语法允许语句定义,例如 print、raise 和 with。虽然这些语句提供了广泛的功能,但可以扩展此语法以适应自定义语句。创建自定义语句涉及两个主要步骤创建自定义语句:修改语法: 您需要更新 Python 的语法以包含新的定义 陈述。这涉及到修改 ...
    编程 发布于2024-11-08
  • 使用 PHP 中的服务层模式实现简洁且可扩展的代码
    使用 PHP 中的服务层模式实现简洁且可扩展的代码
    服务层模式是一种流行的设计方法,用于处理 PHP 应用程序中的业务逻辑。通过将应用程序逻辑与框架分离,我们创建了一个可扩展、可测试和可维护的代码库。在本文中,我们将通过实际示例介绍服务层模式的基础知识、其优点以及如何在 PHP 应用程序中实现它。 什么是服务层模式? 服务层模式是在应...
    编程 发布于2024-11-08
  • 您能否在 C++ 中实现高效的二分搜索算法,将迭代器返回到搜索结果?
    您能否在 C++ 中实现高效的二分搜索算法,将迭代器返回到搜索结果?
    在 C 中搜索高效的二分搜索算法 程序员经常寻求实现高效的二分搜索算法,以提供对数时间复杂度的优势。一个常见的要求是算法返回一个指向搜索结果的迭代器,而不是一个指示其存在的简单布尔值。C 标准库在 标头中提供了 std::binary_search,但它仅返回一个布尔值。正如提问者所指出的,对于需...
    编程 发布于2024-11-08
  • 使用 Javascript 的心形图案代码
    使用 Javascript 的心形图案代码
    代码 let heart = ""; let size = 6; // Loop to print upper part of the heart for (let i = size / 2; i <= size; i = 2) { for (let j = 1; ...
    编程 发布于2024-11-08
  • 如何在 Chrome DevTools 中轻松识别和监控表单元素事件?
    如何在 Chrome DevTools 中轻松识别和监控表单元素事件?
    了解元素交互触发的事件要在可自定义表单元素上正确识别和处理事件,必须了解交互时触发的特定事件。 Chrome DevTools 提供了一个强大的工具,monitorEvents,来协助完成此过程。使用 monitorEvents()检查目标元素: 右键单击​​该元素并选择“Inspect”或在 De...
    编程 发布于2024-11-08
  • 为什么Go不支持传统继承?
    为什么Go不支持传统继承?
    Go中的继承Go为什么不支持传统类型继承?传统类型继承,即子类继承一个或多个父类的定义,不是 Go 编程语言的一项功能。创建者的基本原理在 Go 语言中FAQ,语言创建者解释说,面向对象的编程语言通常强调定义类型之间的关系,这些关系在 Go 中可以自动推断。 Go 类型不会显式指定类型关系,而是自动...
    编程 发布于2024-11-08
  • 如何在 Python 中创建虚拟环境
    如何在 Python 中创建虚拟环境
    Python 虚拟环境对于管理依赖关系和避免项目之间的冲突至关重要。本指南将引导您完成在 Python 中创建和激活虚拟环境的过程。 第 1 步:导航到您的项目目录 打开终端并导航到要设置 Python 虚拟环境的目录。您可以使用 cd 命令来执行此操作: cd /path/to/y...
    编程 发布于2024-11-08
  • 如何在 Go JSON 解组中处理嵌套数组?
    如何在 Go JSON 解组中处理嵌套数组?
    Golang JSON:通过解组处理嵌套数组在 Go 中,在解组后处理嵌套 JSON 数组时,理解错误至关重要“类型接口{}不支持索引。”当您尝试访问存储在interface{}变量中的JSON数组中的元素时,会出现此错误。要解决此问题,您需要利用类型断言将interface{}变量转换为底层数组类...
    编程 发布于2024-11-08
  • 如何在 Java 中组合路径
    如何在 Java 中组合路径
    组合 Java 中的路径C#/.NET 中的 System.IO.Path.Combine 方法允许将多个路径段组合成一个单一、有效的路径。 Java 提供了实现类似功能的替代方法。Path Object在 Java 7 及更高版本中,建议使用 java.nio.file.Path 类进行路径操作。...
    编程 发布于2024-11-08
  • 有效 JSON 有哪些不同的定义?
    有效 JSON 有哪些不同的定义?
    理解最小有效 JSONJSON 的概念已在各种 RFC 和规范中广泛讨论。 RFC4627 最初将 JSON 定义为序列化对象或数组。根据此定义,仅 {}(空对象) 和 [](空数组) 符合有效、完整的 JSON 字符串的条件。但是,ECMA-404引入了一项修正案,扩大了有效 JSON 字符串的范...
    编程 发布于2024-11-08
  • 使用 MapStruct 映射继承层次结构
    使用 MapStruct 映射继承层次结构
    Intro MapStruct provides a rich set of features for mapping Java types. The technical documentation describes extensively the classes and ann...
    编程 发布于2024-11-08
  • 可以处理变量的 ID 以访问 Python 中的对象吗?
    可以处理变量的 ID 以访问 Python 中的对象吗?
    变量的 ID 可以取消引用吗?在 Python 中,id() 函数返回对象的唯一标识符。这个标识符可以存储在变量中,但是这个变量的ID可以解引用吗?从学术角度来看,答案是肯定的。 _ctypes 模块提供了一个函数 PyObj_FromPtr(),可以将指针转换为 Python 对象。使用此函数,我...
    编程 发布于2024-11-08
  • 为什么 imagecreatefrompng() 产生黑色背景而不是透明区域?
    为什么 imagecreatefrompng() 产生黑色背景而不是透明区域?
    imagecreatefrompng() 生成黑色背景而不是透明区域?在 PHP 中,imagecreatefrompng() 函数通常用于处理 PNG图像。然而,据观察,使用此函数时,PNG 透明度可能会转换为纯黑色。要解决此问题,可以在使用 imagecreatetruecolor() 创建新画...
    编程 发布于2024-11-08
  • Go反射中reflect.Type和reflect.Value的主要区别是什么?
    Go反射中reflect.Type和reflect.Value的主要区别是什么?
    Go 中的反射类型和值Go 中的反射允许开发人员在运行时检查和操作类型和值。了解它们的区别对于有效使用反射至关重要。反射中的类型与值在反射中,reflect.TypeOf(i) 返回一个reflect.Type 对象,而reflect.ValueOf(i)返回一个reflect.Value obje...
    编程 发布于2024-11-08
  • 如何在 AngularJS 中安全地设置变量的 iframe src 属性?
    如何在 AngularJS 中安全地设置变量的 iframe src 属性?
    在 AngularJS 中从变量设置 iframe src 属性在 AngularJS 中,尝试从以下位置设置 iframe 的 src 属性时可能会遇到问题一个变量。为了解决这个问题,这里有一个分步指南:1。注入 $sce 服务将 $sce(严格上下文转义)服务注入控制器以处理清理。functio...
    编程 发布于2024-11-08

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3