介绍

双指针算法是一种通过设置两个指针不断进行单向移动来解决问题的算法。

它包含两种形式:

两个指针分别指向不同的序列。比如:归并排序的合并过程。

两个指针指向同一个序列。比如:快速排序的划分过程。

一般更多使用、也更难想到的是第2种情况。

双指针算法最核心的用途就是优化时间复杂度。

【核心思想】:

原本两个指针是有 \(n^2\) 种组合,因此时间复杂度是 \(O(n^2)\)。

而双指针算法就是运用单调性使得指针只能单向移动,因此总的时间复杂度只有 \(O(2n)\),也就是 \(O(n)\)。

之所以双指针可以实现 [公式] 的时间复杂度是因为指针只能单向移动,没有指针的回溯,而且每一步都会有指针移动。

而朴素的 \(O(n^2)\) 算法的问题就在于指针经常回溯到之前的位置。

双指针算法的模板一般都可以写成下面的形式(模板):

for (int i = 0, j = 0; i < n; i++)
{
while (j < i && check(i, j)) j++; // 每道题目的具体逻辑
}

因为双指针算法是一种优化时间复杂度的方法,所以我们可以首先写出最朴素的两层循环的写法。

然后考虑题目中是否具有单调性。

即当其中一个指针 [公式] 向后移动时,在希望得到答案的情况下,另一个指针 [公式] 是不是只能向着一个方向移动。

如果是,说明题目具有单调性,可以通过双指针算法优化。

two-pointer 算法的更多相关文章

  1. 秒杀 2Sum 3Sum 4Sum 算法题

    2 Sum 这题是 Leetcode 的第一题,相信大部分小伙伴都听过的吧. 作为一道标着 Easy 难度的题,它真的这么简单吗? 我在之前的刷题视频里说过,大家刷题一定要吃透一类题,为什么有的人题目 ...

  2. Dynamic Code Evolution for Java dcevm 原理

    在hostswap dcevm中我们对Dynamic Code Evolution VM有了一个简单的了解,这篇文章将介绍Dynamic Code Evolution VM的实现原理. 有两个概念需要 ...

  3. 你真的会做 2 Sum 吗?| 含双重好礼

    小预告:文末有两份福利,记得看到最后哦- 2 Sum 这题是 Leetcode 的第一题,相信大部分小伙伴都听过的吧. 作为一道标着 Easy 难度的题,它真的这么简单吗? 我在之前的刷题视频里说过, ...

  4. Codeforces Edu Round 65 A-E

    A. Telephone Number 跟之前有一道必胜策略是一样的,\(n - 10\)位之前的数存在\(8\)即可. #include <iostream> #include < ...

  5. B树——算法导论(25)

    B树 1. 简介 在之前我们学习了红黑树,今天再学习一种树--B树.它与红黑树有许多类似的地方,比如都是平衡搜索树,但它们在功能和结构上却有较大的差别. 从功能上看,B树是为磁盘或其他存储设备设计的, ...

  6. js基础(改变透明度实现轮播图的算法)

    前面有分享过改变层级的轮播图算法,今天继续利用透明度来实现无位移的轮播图算法. 实现逻辑:将所有要轮播的图片全部定位到一起,即一层一层摞起来,并且利用层级的属性调整正确的图片顺序,将图片的透明度全部设 ...

  7. 由Photoshop高反差保留算法原理联想到的一些图像增强算法。

    关于高反差保留的用处说明呢,从百度里复制了一段文字,我觉得写得蛮好的: 高反差保留就是保留图像的高反差部分,再说得真白些,就是保留图像上像素与周围反差比较大的部分,其它的部分都变为灰色.拿一个人物照片 ...

  8. Lattice Reduction (LLL) 算法C代码实现

    废话不多说,大名鼎鼎的Lenstra-Lenstra-Lovasz(LLL) 算法.实现参考论文:Factoring Polynomials with Rational Coefficients, 作 ...

  9. 模板化的七种排序算法,适用于T* vector<T>以及list<T>

    最近在写一些数据结构以及算法相关的代码,比如常用排序算法以及具有启发能力的智能算法.为了能够让写下的代码下次还能够被复用,直接将代码编写成类模板成员函数的方式,之所以没有将这种方式改成更方便的函数模板 ...

  10. (lintcode全部题目解答之)九章算法之算法班题目全解(附容易犯的错误)

    --------------------------------------------------------------- 本文使用方法:所有题目,只需要把标题输入lintcode就能找到.主要是 ...

随机推荐

  1. KVM vm time setting

    - config file $ grep clock vm02.xml <clock offset='utc'> </clock> - NTP server $ s vm02 ...

  2. LangChain:打造自己的LLM应用

    1.LangChain是什么 LangChain是一个框架,用于开发由LLM驱动的应用程序.可以简单认为是LLM领域的Spring,以及开源版的ChatGPT插件系统.核心的2个功能为: 1)可以将 ...

  3. 构建易于运维的 AI 训练平台:存储选型与最佳实践

    伴随着公司业务的发展,数据量持续增长,存储平台面临新的挑战:大图片的高吞吐.超分辨率场景下数千万小文件的 IOPS 问题.运维复杂等问题.除了这些技术难题,我们基础团队的人员也比较紧张,负责存储层运维 ...

  4. RobotFrameWork环境搭建及使用

    RF环境搭建 首先安装python并且配置python环境变量 pip install robotframework pip install robotframework-ride 生产桌面快捷方式 ...

  5. 【教程】AWD中如何通过Python批量快速管理服务器?

    前言 很多同学都知道,我们常见的CTF赛事除了解题赛之外,还有一种赛制叫AWD赛制.在这种赛制下,我们战队会拿到一个或多个服务器.服务器的连接方式通常是SSH链接,并且可能一个战队可能会同时有多个服务 ...

  6. 简述redis的单线程模式

    前言 在redis版本6之前,网络IO和键值对读写都是由一个线程来完成的.而redis的其他功能,比如持久化.异步删除.集群数据同步等,是由其他线程完成的. 为什么采用单线程 多线程有助于提升吞吐率( ...

  7. Python实现输入三个整数x,y,z,请把这三个数由小到大输出;

    num1=input('请输入第一个数,x:') num2=input('请输入第二个数,y:') num3=input('请输入第三个数,z:') if num1>num2: # if 语句判 ...

  8. BUUCTF-Youngter-drive 双线程的思考

    拿到后先upx脱壳,然后直接进 从上向下看 应该是输入 慢慢看 明显的加密 这个函数大概是个加密 但是这个sleep函数是什么鬼??? 以下将拓展些许有关"线程"的概念:    一 ...

  9. 你能看到这个汉字么“  ” ?关于Unicode的私人使用区(PUA) 和浏览器端显示处理

    如果你现在使用的是chrome查看那么你是看不到我标题中的汉字的,显示为一个小方框,但是你使用edge查看的话,这个字就能正常的显示出来,不信你试试! 本故事源于我在做数据过程中遇到Unicode编码 ...

  10. Python 导入 Excel多sheet

    Python 导入 Excel多sheet 假设表格的样式如下 import os import sys import django BASE_DIR = os.path.dirname(os.pat ...