
双指针
小胡同的诗
千里之行,始于足下
展开
-
LeetCode287 寻找重复数(双指针 | 弗洛伊德判圈)
题目链接:leetcode287题面解题思路二分二分重复的数的答案,根据抽屉原理,数据中必有重复的数时间复杂度:O(nlogn)O(nlogn)O(nlogn) ,空间复杂度:O(1)O(1)O(1)双指针构造一个快慢指针,第一次相遇后,继续走c步到达环的起点也就是入度大于2的点,即重复的数。证明:设环之前的长度为a,环起点到相遇点长度为b,相遇点到环起点为c由于起初步长相差1,所以直到相遇时,快指针路程一定只比慢指针多k(b+c),也就是环的长度的整数倍并且两者的路程是两倍的关系原创 2020-12-07 09:00:59 · 357 阅读 · 0 评论 -
LeetCode777 在LR字符串中交换相邻字符(双指针)
题目链接:leetcode777题面题目大意L只能左移,R只能右移,并且移动的时候旁边要有X帮助,问能否从当前移动到目标串。解题思路对于一个串,我们只需要考虑非『X』的元素,因为一旦其他两者复原则『X』也随之复原。广搜口胡一下,空间复杂度可能很高,并且时间复杂度也不低,可以用双向广搜优化一下。代码略。双指针我们从左到右扫,如果当前串和目标串最近的一个非「X」元素不相等,则一定不能复原,因为无论如何都会存在两个移动区间相交的点;如果只能目标串的元素在当前元素能移动的相反方向,则也不能复原创 2020-10-20 22:12:32 · 350 阅读 · 0 评论 -
LeetCode143 重排链表(双指针)
题目链接:leetcode143题面题目大意略解题思路首先用快慢指针找到链表的中点,并分成两个链表,为了方便操作,前面的链表的长度要大于等于后面的链表;接着,把后面的链表逆置,为了方便操作,前面链表的链尾可以暂时称位后面链表的头节点;最后将两个链表归并,由于归并操作要交替插入,于是我们结束的标志是后面链表完全插入到前面的链表的时候算法结束,这也是为什么我们要使得前面的链表元素不小于后面链表的原因。时间复杂度 O(n)O(n)O(n),空间复杂度 O(1)O(1)O(1)。代码实现/**原创 2020-09-26 22:21:52 · 143 阅读 · 0 评论 -
LeetCode 142 环形链表Ⅱ(双指针)
题目链接:leetcode142题面题目大意给你一个链表可能有环,如果有环输出环的入口节点,否则输出 NULL解题思路双指针首先快慢指针进行找环,之后根据滑动窗口寻找入口。我们可以大致证明一下:假设慢指针走的长度为 lalala ,快指针走的长度为 lblblb ,整个链表的节点个数为 sss。那么,整个环的长度可以等于 lb−lalb-lalb−la,非环部分的长度为 s−(lb−la)s-(lb-la)s−(lb−la) ,又因为快指针的长度为慢指针的两倍,即 lb=2lalb=原创 2020-09-22 23:58:18 · 696 阅读 · 0 评论 -
LeetCode109 有序链表转二叉搜索树(分治 | 双指针)
题目链接:leetcode109题面题目大意给你一个有序数组,让你转成一个平衡的二叉搜索树解题思路乍一看这道题似乎要构造一个 平衡二叉树,而平衡二叉树的实现方法有多种,例如: SplayTree、AVLTree、SBTree、RBTree等。但代码量感人,根据他人思路大致总结如下几种方法:寻找中位数+分治具体思路就是每次对于一个有序链表,取中位数作为根节点,之后左半边和右半边分别递归构造子树。能否满足平衡的限制呢?我们发现左右区间的元素数量最多相差 1 个,显然满足。如何寻找中位数呢?数原创 2020-09-17 10:08:05 · 180 阅读 · 0 评论 -
LeetCode86 分隔链表(双指针)
题目链接:leetcode86题目大意给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。你应当保留两个分区中每个节点的初始相对位置。示例:输入: head = 1->4->3->2->5->2, x = 3输出: 1->2->2->4->3->5相对位置不变相当于稳定地区分,比如两个相等的数原本的位置划分后不能更改这个相对位置,不同的数更是如此。解题思路双指针可以维护两个链原创 2020-09-04 16:05:11 · 174 阅读 · 0 评论 -
LeetCode82 删除排序链表中的重复元素 II(思维)
题目链接:leetcode82题目大意给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。示例一:输入: 1->2->3->3->4->4->5输出: 1->2->5示例二:输入: 1->1->1->2->3输出: 2->3简而言之就是删掉原始序列中,所有出现次数大于1的元素。解题思路直接删除AC 的代码就是这个方法,但逻辑可能略显冗余。先建一个头节点使链表变成带头原创 2020-09-04 00:42:18 · 138 阅读 · 0 评论 -
LeetCode75 颜色分类(三指针)
题目链接:leetcode75题目大意给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。注意:不能使用代码库中的排序函数来解决这道题。示例:输入: [2,0,2,1,1,0]输出: [0,0,1,1,2,2]进阶:一个直观的解决方案是使用计数排序的两趟扫描算法。首先,迭代计算出0、1 和 2 元素的个数,然后按照0、1、2的排序,重写当前原创 2020-09-02 23:55:45 · 143 阅读 · 0 评论 -
LeetCode42 接雨水(单调栈 | 联通块 | 动态规划预处理 | 双指针 | 容斥)
题目链接:leetcode42题目大意给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。示例:输入: [0,1,0,2,1,0,1,3,2,1,2,1]输出: 6解题思路首先要先明白一个通识,即木桶原理。木桶的容量取决于最低的挡板高度。暴力枚举对于每一个柱子,我们都可以单独计算它对整体容量的贡献,原创 2020-08-24 17:42:46 · 265 阅读 · 0 评论 -
LeetCode19 删除链表的倒数第N个节点(快慢指针/滑动窗口)
题目链接:leetcode19题目大意给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。示例:给定一个链表: 1->2->3->4->5, 和 n = 2.当删除了倒数第二个节点后,链表变为 1->2->3->5.解题思路双指针/滑动窗口『剑指offer』有道和这题类似的,那题是找到倒数第k个点,但不用删除。链接。这题由于需要删除,所以找到倒数第k+1个元素,但可能不存在第k+1个元素,即k==n的case,最后特判一下就行了。原创 2020-08-20 23:43:29 · 150 阅读 · 0 评论 -
LeetCode11 盛最多水的容器(双指针)
题目链接:leetcode11题目大意给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。说明:你不能倾斜容器,且 n 的值至少为 2。图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。示例:输入:[1,8,6,2,5,4,8原创 2020-08-20 00:00:06 · 121 阅读 · 0 评论