算法与数据结构基础 - 双指针(Two Pointers)
双指针基础
双指针(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题:
26. Remove Duplicates from Sorted Array 题解
80. Remove Duplicates from Sorted Array II 题解
349. Intersection of Two Arrays 题解
350. Intersection of Two Arrays II 题解
844. Backspace String Compare 题解
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 题解
滑动窗口(Sliding Windows)也属于同方向指针,关于滑动窗口详见:
算法与数据结构基础 - 滑动窗口(Sliding Window)
快慢指针
若双指针以固定步长移动,如第一个指针移动两步、第二个指针移动一步,这种我们称之为快慢指针。快慢指针常用于单向链表环(Cycle)判断、Loop判断等问题。
相关LeetCode题:
19. Remove Nth Node From End of List 题解
234. Palindrome Linked List 题解
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题:
345. Reverse Vowels of a String 题解
1093. Statistics from a Large Sample 题解
11. Container With Most 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 题解
167. Two Sum II - Input array is sorted 题解
923. 3Sum With Multiplicity 题解
算法与数据结构基础 - 双指针(Two Pointers)的更多相关文章
- 算法与数据结构基础 - 数组(Array)
数组基础 数组是最基础的数据结构,特点是O(1)时间读取任意下标元素,经常应用于排序(Sort).双指针(Two Pointers).二分查找(Binary Search).动态规划(DP)等算法.顺 ...
- 算法与数据结构基础 - 深度优先搜索(DFS)
DFS基础 深度优先搜索(Depth First Search)是一种搜索思路,相比广度优先搜索(BFS),DFS对每一个分枝路径深入到不能再深入为止,其应用于树/图的遍历.嵌套关系处理.回溯等,可以 ...
- 算法与数据结构基础 - 堆(Heap)和优先级队列(Priority queue)
堆基础 堆(Heap)是具有这样性质的数据结构:1/完全二叉树 2/所有节点的值大于等于(或小于等于)子节点的值: 图片来源:这里 堆可以用数组存储,插入.删除会触发节点shift_down.shif ...
- 算法与数据结构基础 - 广度优先搜索(BFS)
BFS基础 广度优先搜索(Breadth First Search)用于按离始节点距离.由近到远渐次访问图的节点,可视化BFS 通常使用队列(queue)结构模拟BFS过程,关于queue见:算法与数 ...
- 算法与数据结构基础 - 哈希表(Hash Table)
Hash Table基础 哈希表(Hash Table)是常用的数据结构,其运用哈希函数(hash function)实现映射,内部使用开放定址.拉链法等方式解决哈希冲突,使得读写时间复杂度平均为O( ...
- 算法与数据结构基础 - 二叉树(Binary Tree)
二叉树基础 满足这样性质的树称为二叉树:空树或节点最多有两个子树,称为左子树.右子树, 左右子树节点同样最多有两个子树. 二叉树是递归定义的,因而常用递归/DFS的思想处理二叉树相关问题,例如Leet ...
- 算法与数据结构基础 - 分治法(Divide and Conquer)
分治法基础 分治法(Divide and Conquer)顾名思义,思想核心是将问题拆分为子问题,对子问题求解.最终合并结果,分治法用伪代码表示如下: function f(input x size ...
- 算法与数据结构基础 - 贪心(Greedy)
贪心基础 贪心(Greedy)常用于解决最优问题,以期通过某种策略获得一系列局部最优解.从而求得整体最优解. 贪心从局部最优角度考虑,只适用于具备无后效性的问题,即某个状态以前的过程不影响以后的状态. ...
- 算法与数据结构基础 - 图(Graph)
图基础 图(Graph)应用广泛,程序中可用邻接表和邻接矩阵表示图.依据不同维度,图可以分为有向图/无向图.有权图/无权图.连通图/非连通图.循环图/非循环图,有向图中的顶点具有入度/出度的概念. 面 ...
随机推荐
- 走近Java之HashMap In JDK8
HashMap,继承AbstractMap类,实现了Map接口,特性是无序不可重复,其本身的数据结构是数组加链表和红黑树.今天我们就一起来详细了解一下. 首先,需要知道,HashMap中几个关键词的含 ...
- Bzoj: 2073 [POI2004]PRZ 题解
2073: [POI2004]PRZ Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 401 Solved: 296[Submit][Status][D ...
- 每周一个js重要概念之一 调用堆栈
js写了也有两年多了,大到复杂的后台系统,小到页面,还有日均300万的网页主站,HTML5的适配页面等等. 框架也杂七杂八接触了不少,从小的jquery.bootstrap.echarts等等,到大一 ...
- xfs 文件系统修复
pvcreate /dev/sdb1 pvcreate /dev/sdc1 pvcreate /dev/sdd1 vgcreate vg_bricks /dev/sdb1 vgcreate vg_br ...
- MyBatis if标签的用法
<!-- 4.1.1 在WHERE条件中使用if 需求: 实现一个用户管理高级查询功能,根据输入的条件去检索用户信息.这个功能 还需要支持以下三种情况:当只有输入用户名时,需要根据用户名进行模糊 ...
- Postgresql_fdw
Postgresql_fdw 测试环境 Ubuntu 16.04 LTS云主机2台,主机名为pg1(192.168.0.34)和pg2(192.168.0.39). 安装postgresql 下面这个 ...
- html css 布局小细节
学了两个月的html和css每天都重复一样的生活,敲着大同小异的代码,这样的生活枯燥无味.我腻了,我也累了!小米首页算是我写的第三个静态页面,写了好久,很多细节都把握不好,下面的这个简单的布局细节是我 ...
- 「PowerBI」分析服务多维数据结构重回关系数据库的一大绝招
在过往Excel催化剂定位的轻量级Excel+PowerBIDesktop的解决方案中,已经做过了近乎完美的PowerBIDesktop数据模型数据导出到Excel工作表的应用,这也是个人版数据应用的 ...
- spark 源码分析之九--Spark RPC剖析之StreamManager和RpcHandler
StreamManager StreamManager类说明 StreamManager 官方说明如下: The StreamManager is used to fetch individual c ...
- 《HelloGitHub》第 40 期
<HelloGitHub>第 40 期 兴趣是最好的老师,HelloGitHub 就是帮你找到兴趣! 简介 分享 GitHub 上有趣.入门级的开源项目. 这是一个面向编程新手.热爱编程. ...