Two Pointers
冲
山顶夕景
实践出真知
展开
-
【Leetcode680】验证回文字符串 II(贪心算法)
一、题目二、思路审题看清楚,,题目问的不是回文子串,不是子串!!!暴力解法会超时,可以使用双指针:如果当前左右指针指向的元素不相等,可以试着判断删除掉左元素或者右元素后的字符串是否为回文字符串,注意此时i左边和j右边是已经判断完了(再重复一次!判断的不是回文子串);如果当前左右指针指向的元素相等,则左指针向右一格,右指针向左一格。每次两指针表示的字符判断相等,则该部分就符合回文串,贪心思想。三、代码class Solution {public: bool validPalin原创 2022-02-20 17:33:05 · 756 阅读 · 0 评论 -
【LeetCode844】比较含退格的字符串(双栈or双指针)
一、题目提示:1 <= s.length, t.length <= 200s 和 t 只含有小写字母以及字符 ‘#’进阶:可以用 O(n) 的时间复杂度和 O(1) 的空间复杂度解决该问题吗?二、法一:双栈法如果不考虑用O(1)O(1)O(1)的空间复杂度,很容易想到这种添加,删除的步骤,可以用到栈的入栈和出栈,所以可以用2个栈模拟2条字符串的退格运算:class Solution {public: bool backspaceCompare(string s, s原创 2022-02-18 20:54:15 · 741 阅读 · 0 评论 -
【LeetCode16】最接近的三数之和(双指针)
一、题目二、思路和leetcode15三数之和类似,三层循环时间复杂度O(n3)O(n^3)O(n3)过高,使用双指针虽说不能马上降到O(n)O(n)O(n),但就是这类题的常用套路:遍历一遍数组元素,当前元素为num[i];设立左右指针,右指针为右端点,注意左指针为left + 1,而不是从0开始,否则会因为重复遍历而有重复元素;当三数之和大于target则right左移缩小值。每次判断当前三数组合时,即计算和target之间的差值,如果比当前最小差值minAbsError还小,则可以进行更原创 2022-02-13 11:55:17 · 598 阅读 · 0 评论 -
【LeetCode142】环形链表 II
一、环形链表 II进阶:用O(1)实现。二、思路快慢指针,其实和【环形链表 I】差不多,那个是判断是否有环,现在这题是找出开始入环的第一个结点。同样适用快慢指针,由下图分析,因为快指针的速度设置为慢指针的2倍(每次满指针走1步,快指针走2步),由2(F+a)= F+a+b+a,得到F=b的关键信息。所以当两个指针第一次相遇后,我们让快指针回到head原点,这时候让快指针和满指针以相同速度前进,即快指针走F步,慢指针走b步,就能够到达所求的环入口,进行相遇了。三、代码/** * Defini原创 2022-01-11 17:08:19 · 980 阅读 · 0 评论 -
【LeetCode415】字符串相加(简单双指针)
一、题目二、思路简单题。不能用函数,就用小学数学相加的方法(从右至左),存储进位carry值。双指针分别从右到左遍历两个字符串注意:(1)当其中一方没有数字了,另一方还有的时候,就往没有的一方填充0,这里有个trick用三元表达式写得短点哈哈。(2)最后出了循环后carry还需要判断最后一次的,别漏了。三、Python3代码class Solution: def addStrings(self, num1: str, num2: str) -> str: i原创 2021-11-07 11:05:29 · 586 阅读 · 0 评论 -
【LeetCode15】三数之和(双指针,去重)
1.题目2.思路显然三层for循环的时间复杂度O(n)O(n)O(n)会超时,为了减少时间复杂度我们要去除重复解,逐个遍历数组元素,转成求两数之和,用双指针。PS:按照题目意思不能包含重复的三元组,所以比如,如果有多个-1组成的(-1,0,1)也只能算一个。核心步骤(排序数组后):当nums[i]+nums[L]+nums[R]==0,执行循环,判断左界和右界是否和下一位置重复,去除重复解。并同时将 L,R移到下一位置,寻找新的解若和大于 00,说明 nums[R]nums[R] 太大,RR原创 2021-07-13 12:54:58 · 823 阅读 · 3 评论 -
【LeetCode287】寻找重复数(依次映射关系->快慢指针)
1.题目2.思路下标01234num13325栗子如上,我们可以将数组下标和对应num值看做一个映射关系,而且将num值看做下一个数组的下标值,即组成了 0-》1-》3-》2-》3,最后的3其实就是2指回了中间的3,也就又回到了环状链表题——使用双指针。注意:快慢指针最终相遇的点只能确定是在环中的,而非最终的重复数。即快慢指针只能保证会在环内相遇,但是重复数字应该是环入口的数字。当fast和last相遇之后,我们设置第三个指针pre2,它从起点开始和s原创 2021-05-22 00:13:44 · 687 阅读 · 0 评论 -
【LeetCode75】颜色分类(双指针)
1.题目2.思路思路很清晰:如果从0左边开始往右遍历,遇到0就扔到左边指针l处,遇到2就扔到右边指针r处,这里说的“扔”即交换两个元素的动作。一定注意!我们的前提是从左往右遍历,对于遇到0时两个下标都要改变,而遇到2时只用改变右指针下标。当我们交换0时i是可以increment的,因为l指的位置只有可能是1,而我们遍历时无视1,然而将2换到右边时我们需要再次检查换过来的数字,所以不要increment i。3.代码class Solution(object): def sortCo原创 2021-05-18 01:25:08 · 679 阅读 · 1 评论 -
【LeetCode11】盛最多水的容器(反向双指针)
1.题目2.思路暴力枚举是2个指针通向进行,而不要暴力枚举就是为了减少不必要的枚举:两个指针初始在两端,即一个指针在数组最左边,另一个指针在数组最右边。每次计算完面积后,将所在高度矮的指针向数组中心移动一格,再重新计算面积,直到两个指针相遇。现在这样就省去了如某一时刻时矮指针和【矮指针和高指针之间的元素】之间的比较,因为他们的面积都是会比这时刻的矮指针和高指针的面积小。举个栗子:下图的i指针在下标0处,j在下标3处,而现在省掉的就是下标0和下标1、下标0和下标2组成的面积(指符合题意的那个面积)原创 2021-02-08 21:49:49 · 662 阅读 · 0 评论 -
【LeetCode141】环形链表(双指针)
1.题目2.思路有点像小学数学的追及问题:若链表存在环,快指针每次走2步,而慢指针每次走1步,那么快指针一开始肯定比慢指针快2倍距离,而有环的话快指针优先进入环,又因为慢指针也进入环时,两个指针每次运动就会使距离减1,逐渐相遇。3.代码/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x原创 2021-02-06 14:34:11 · 2179 阅读 · 3 评论 -
【2020】打地鼠(贪心&双指针)
1.题目给定 n 个整数 a1, a2, …, an 和⼀个 d,你需要选出若干个整数,使得将这些整数从小到大排好序之后,任意两个相邻的数之差都不小于给定的 d,问最多能选多少个数出来。输入格式第一行两个整数 n,d (1<=n<=10^5, 0<=d<=10^9),分别表示整数个数和相邻整数差的下界。第二行 n 个整数 a1, a2, …, an (1<=ai<=10^9, 1<=i<=n),表示给定的 n 个整数。输出格式仅一行⼀个整数,表⽰答原创 2021-02-03 20:15:09 · 1171 阅读 · 1 评论 -
【LeetCode26】删除排序数组中的重复项(双指针)
文章目录1.题目2.法一:STL的unique3.法二:双指针1.题目就地删除即不能辅助多余数组空间。2.法一:STL的unique法一:直接使用stl的vector的unique去重,该去重函数不是直接删除重复元素,而是将相邻且重复的元素放入到vector的尾部,然后返回指向第一个重复元素的迭代器,所以要用erase删除尾巴的那些重复元素再统计size。class Solution {public: int removeDuplicates(vector<int>&am原创 2021-02-01 12:48:37 · 734 阅读 · 0 评论 -
【LeetCode27】移除元素(双指针)
1.题目2.思路要原地去掉数值为val的数,最浅显的暴力做法就是遍历到该数时直接依次将数组后面的数字往前移动一个,如下:class Solution {public: int removeElement(vector<int>& nums, int val) { int size = nums.size(); for (int i = 0; i < size; i++) { if (nums[i] == va原创 2021-02-01 01:58:24 · 731 阅读 · 0 评论 -
【1104】Sum of Number Segments (20分)【简单数学】
1.题目https://pintia.cn/problem-sets/994805342720868352/problems/994805363914686464求出一个正数数列中的连续子列(片段)和的累加。2.思路【法一】可以暴力找数学规律,但是有点花时间,因为最终是要求第i个数的出现次数再最后累加,所以先抽象如为第1、2、3、…、7个数,依次计算第1、2、3、…7个数在长度为1的片段中出现的次数为1 1 1…1,同理计算1、2、3、…7个数在长度为1的片段中出现的次数为1 2 2…2 1,这样原创 2021-01-10 11:39:34 · 695 阅读 · 0 评论 -
【1089】Insert or Merge (25 分)
#include<iostream>#include<stdio.h>#include<stdlib.h>#include<math.h>#include<string.h>#include<algorithm> #include<map>#include<vector>#inclu...原创 2019-08-13 16:48:20 · 366 阅读 · 0 评论 -
two pointers
two pointers思想利用问题本身与序列的特性,利用两个下标i、j对序列进行同向或反向扫描,以降低时间复杂度(一般是O(n)的复杂度)。1.两数相加递增的正整数序列中,如{1、2、3、4、5、6}中找出满足两个数相加之和为M=8的所有组合。思路最直观的思路是两层for循环暴力遍历,if判断两个数之和是否为M,如果不是,则继续枚举,显然时间复杂度很高。根据题目的序列是递增的特点,可以使用两个下标——下标i指向序列的第一个元素,下标j指向序列的最后一个元素。根据a[i]+a[j]和M的大小得原创 2021-01-09 17:14:14 · 1398 阅读 · 2 评论