双指针基础

双指针(Two Pointers)是面对数组、链表结构的一种处理技巧。这里“指针”是泛指,不但包括通常意义上的指针,还包括索引、迭代器等可用于遍历的游标。

同方向指针

设定两个指针、从头往尾(或从尾到头)遍历,我称之为同方向指针,第一个指针用于遍历,第二个指针满足一定条件下移动。例如 LeetCode题目 283. Move Zeroes:

    // 283. Move Zeroes
void moveZeroes(vector<int>& nums) {
int i=;
for(int j=;j<nums.size();j++){
if(nums[j]!=) nums[i++]=nums[j];
}
while(i<nums.size()) nums[i++]=;
}

相关LeetCode题:

283. Move Zeroes  题解

26. Remove Duplicates from Sorted Array  题解

80. Remove Duplicates from Sorted Array II  题解

349. Intersection of Two Arrays  题解

350. Intersection of Two Arrays II  题解

925. Long Pressed Name  题解

88. Merge Sorted Array  题解

844. Backspace String Compare  题解

86. Partition List  题解

986. Interval List Intersections  题解

209. Minimum Size Subarray Sum  题解

713. Subarray Product Less Than K  题解

826. Most Profit Assigning Work  题解

930. Binary Subarrays With Sum  题解

838. Push Dominoes  题解

滑动窗口(Sliding Windows)也属于同方向指针,关于滑动窗口详见:

算法与数据结构基础 - 滑动窗口(Sliding Window)

快慢指针

若双指针以固定步长移动,如第一个指针移动两步、第二个指针移动一步,这种我们称之为快慢指针。快慢指针常用于单向链表环(Cycle)判断、Loop判断等问题。

相关LeetCode题:

19. Remove Nth Node From End of List  题解

141. Linked List Cycle  题解

142. Linked List Cycle II  题解

234. Palindrome Linked List  题解

457. Circular Array Loop  题解

287. Find the Duplicate Number  题解

反方向指针

若双指针其中一个从头开始、另一个从尾开始,两者往中间遍历,这种使用方法我称之为反方向指针。例如常见的反转字符串问题 LeetCode 344. Reverse String:

    // 344. Reverse String
void reverseString(vector<char>& s) {
int i=,j=s.size()-;
while(i<j) swap(s[i++],s[j--]);
}

相关LeetCode题:

344. Reverse String  题解

125. Valid Palindrome  题解

345. Reverse Vowels of a String  题解

61. Rotate List  题解

75. Sort Colors  题解

1093. Statistics from a Large Sample  题解

11. Container With Most Water  题解

42. Trapping Rain Water  题解

应用于有序数列

一些情况下先对数组排序,利用有序这个性质来判别双指针怎么移动,例如 LeetCode题目 15. 3Sum:

            // 15. 3Sum
int l=i+, r=nums.size()-;
while(l<r){
int tmp=nums[i]+nums[l]+nums[r];
if(tmp>) r--;
else if(tmp<) l++;
……
}

相关LeetCode题:

977. Squares of a Sorted Array  题解

360. Sort Transformed Array  题解

532. K-diff Pairs in an Array  题解

881. Boats to Save People  题解

167. Two Sum II - Input array is sorted  题解

15. 3Sum  题解

16. 3Sum Closest  题解

259. 3Sum Smaller  题解

923. 3Sum With Multiplicity  题解

18. 4Sum  题解

算法与数据结构基础 - 双指针(Two Pointers)的更多相关文章

  1. 算法与数据结构基础 - 数组(Array)

    数组基础 数组是最基础的数据结构,特点是O(1)时间读取任意下标元素,经常应用于排序(Sort).双指针(Two Pointers).二分查找(Binary Search).动态规划(DP)等算法.顺 ...

  2. 算法与数据结构基础 - 深度优先搜索(DFS)

    DFS基础 深度优先搜索(Depth First Search)是一种搜索思路,相比广度优先搜索(BFS),DFS对每一个分枝路径深入到不能再深入为止,其应用于树/图的遍历.嵌套关系处理.回溯等,可以 ...

  3. 算法与数据结构基础 - 堆(Heap)和优先级队列(Priority queue)

    堆基础 堆(Heap)是具有这样性质的数据结构:1/完全二叉树 2/所有节点的值大于等于(或小于等于)子节点的值: 图片来源:这里 堆可以用数组存储,插入.删除会触发节点shift_down.shif ...

  4. 算法与数据结构基础 - 广度优先搜索(BFS)

    BFS基础 广度优先搜索(Breadth First Search)用于按离始节点距离.由近到远渐次访问图的节点,可视化BFS 通常使用队列(queue)结构模拟BFS过程,关于queue见:算法与数 ...

  5. 算法与数据结构基础 - 哈希表(Hash Table)

    Hash Table基础 哈希表(Hash Table)是常用的数据结构,其运用哈希函数(hash function)实现映射,内部使用开放定址.拉链法等方式解决哈希冲突,使得读写时间复杂度平均为O( ...

  6. 算法与数据结构基础 - 二叉树(Binary Tree)

    二叉树基础 满足这样性质的树称为二叉树:空树或节点最多有两个子树,称为左子树.右子树, 左右子树节点同样最多有两个子树. 二叉树是递归定义的,因而常用递归/DFS的思想处理二叉树相关问题,例如Leet ...

  7. 算法与数据结构基础 - 分治法(Divide and Conquer)

    分治法基础 分治法(Divide and Conquer)顾名思义,思想核心是将问题拆分为子问题,对子问题求解.最终合并结果,分治法用伪代码表示如下: function f(input x size ...

  8. 算法与数据结构基础 - 贪心(Greedy)

    贪心基础 贪心(Greedy)常用于解决最优问题,以期通过某种策略获得一系列局部最优解.从而求得整体最优解. 贪心从局部最优角度考虑,只适用于具备无后效性的问题,即某个状态以前的过程不影响以后的状态. ...

  9. 算法与数据结构基础 - 图(Graph)

    图基础 图(Graph)应用广泛,程序中可用邻接表和邻接矩阵表示图.依据不同维度,图可以分为有向图/无向图.有权图/无权图.连通图/非连通图.循环图/非循环图,有向图中的顶点具有入度/出度的概念. 面 ...

随机推荐

  1. 小程序组件-swipe多页切换,并支持下拉刷新,上拉加载,menu动态联动切换

    前言 最近一个小程序项目中遇到一个需求,就是实现类似资讯类app的多页面切换的那种效果, 如下图: 最终效果: 1.功能分析 首先实现这个功能分为三步: 实现顶部menu菜单 实现多页面滑动切换 支持 ...

  2. 《深入浅出MFC》下载

    百度云及其他网盘下载地址:点我 编辑推荐 <深入浅出MFC>内含光盘一片,书中所有原始码与可执行文件尽在其中. 作者简介 侯俊杰,先生不知何许人也,闲静少言,不慕荣利.好读书,求甚解:每有 ...

  3. Windows下必备的开发神器之Cmder使用说明

    诚言,对于开发码字者,Mac和Linux果断要比Windows更贴心;但只要折腾下,Windows下也是有不少利器的.之前就有在Windows下效率必备软件一文中对此做了下记载:其虽没oh-my-zs ...

  4. NioEventLoop启动流程源码解析

    NioEventLoop的启动时机是在服务端的NioServerSocketChannel中的ServerSocketChannel初始化完成,且注册在NioEventLoop后执行的, 下一步就是去 ...

  5. 获取一个整数所有的质因数(C语言实现)

    一.题目要求 1. 用户输入任意一个整数,要求程序输出此整数所有的质因数: 2. 用户可以反复输入,直至输入字符'q'退出程序. 二.分析 质因数的概念大家可以问度娘. 题目关键有几个要点,分析透了这 ...

  6. MyBatis从入门到精通:select用法进一步讲解

    selectAll:笔记 /* 定义接口方法的返回值的时候,必须注意查询SQL可能返回的结果数量.当 返回值最多只有一个结果的时候,可以将结果返回值定义为SysUser,此时 返回值类型为List&l ...

  7. .NET CORE上传文件到码云仓库【搭建自己的图床】

    .NET CORE上传文件到码云仓库[搭建自己的图床] 先建一个公共仓库(随意提交一个README文件或者.gitignore文件保证master分支的存在),然后到gitee的个人设置页面找到[私人 ...

  8. Shiro authentication for Apache Zeppelin

    Overview Apache Shiro is a powerful and easy-to-use Java security framework that performs authentica ...

  9. Shrio多Realm认证及认证策略

    在大型的系统中,安全数据可能会存放在多个数据库中,而且每个数据的加密方式也是不一样的,那么单一的Realm就无法完成. 这时,就需要用到多Realm认证了,多Realm又涉及到认证策略,及在多个Rea ...

  10. Java面试题 从源码角度分析HashSet实现原理?

    面试官:请问HashSet有哪些特点? 应聘者:HashSet实现自set接口,set集合中元素无序且不能重复: 面试官:那么HashSet 如何保证元素不重复? 应聘者:因为HashSet底层是基于 ...