双指针
Noric!
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
438 找到字符串中所有字母异位词
仅包含小写字母,且异位词不关心字符的顺序,可以使用长度为26的数组,通过记录26个字母的个数来比较,减少时间复杂度。这个题目解法没什么特别的,遍历所有子串,比较与目标字符串是否满足异位词即可。唯一需要注意的是,提示。原创 2024-09-14 19:31:40 · 314 阅读 · 0 评论 -
3 无重复字符的最长子串
遍历过程中不断记录左右边界距离的最大值,最后返回输出即可。分别记录片段的左边界和右边界。的元素是否已存在:若存在,需要移动。首先要理解“子串”,是输入字符串。快速查找当前片段内的元素。从0~字符串长度,每次检查。原创 2024-09-12 23:14:26 · 222 阅读 · 0 评论 -
15 三数之和
需要换一种角度,可以从重复的三元组出发去想一想。给不同重复的三元组创立一种相同编码方式,可以通过从小到大排序来完成。其实也可以试着反过来想一想,先把数组排序,然后再从中找三元组怎么样呢?但是即便如此找到的三元组仍可能重复,还得有一步去重的操作。这样算下来,空间复杂度还是比较高的,且代码实现起来比较麻烦。若三数之和为0,那么只要知道其中的两个,就可以知道第三个数的值。若想在有序数组去除重复的三元组,仅需要在遍历。要找到所有和为0的三元组,使用暴力去解的话时间复杂度为。的值,需要借助有序数组递增的性质。原创 2024-09-11 00:02:37 · 977 阅读 · 0 评论 -
11 盛最多水的容器
由于直线的高度排列是随机的,不好控制,因此我们可以先从容器的长度入手。给定数组后,容器最大的长度 = 数组的长度。选择长度最大的容器,其容量不一定是最大的,但是可以通过不断收缩边界,从容器高度这一维度中寻找容量更大的可能性。边界可以从左边收缩,也可以从右边伸缩,所以可以借助。就还存在收缩的空间,由于容器的高度由高度较小的直线决定,因此每次收缩就选择两条边界中长度更小的那一个。在收缩的过程中,不断计算当前容器的容量,并记录一个最大值最后输出即可。(两条直线长度的最小值)。容器的盛水量由两个因素决定,一个是。原创 2024-09-04 23:28:20 · 284 阅读 · 0 评论 -
141 环形链表
存在环的条件下,如何证明两指针一定会享相遇呢?最容易想到的方法,就是遍历链表同时用哈希表。但能不能更进一步优化空间复杂度到。如果链表不存在环,则。为所有自然数,所以一定能够到达。遇到重复节点则认为存在环,返回。这种方法简单直接,时间复杂度。会在环中绕圈,直到某一时刻与。,则链表中不存在环,返回。- 为链表中环的长度。借用双指针的思路,用。每次前进1步,快指针。原创 2023-12-12 22:29:24 · 217 阅读 · 0 评论 -
234 回文链表
由于链表的结构特点,访问链表中的元素的时间复杂度为O(n)。相比较而言,使用数组会方便很多,实现O(1)访问。所以这个题,可以先遍历一遍把数值存到数组中,再使用双指针判断是否是回文。原创 2023-12-05 22:22:57 · 224 阅读 · 0 评论 -
283 移动零
这个思路虽然可行,但实现代码仍有些繁琐,需要同时移动两个指针,并且考虑两个指针的范围问题。要创造自己一个假设,并在每一步都要做与假设一致的操作,维持假设成立,最后将假设变成“现实”。:假设以其为分界点,左边均为非零元素,右边均为0元素;:不断向右探索的指针,直至遍历到数组最后一个元素停止。右移1,以保证假设成立。若数组中无0元素,在移动过程中。若任意一个指针到达数组末尾时停止。,找到第一个非零元素时交换二者的值;每次仅移动一次指针(很多算法题的解题思路,都与。右边第一个非零元素坐标。始终指向第一个0元素。原创 2023-10-15 22:47:08 · 538 阅读 · 0 评论 -
Leetcode76 最小覆盖子串
本题可以用双指针解决。收缩指针i和延伸指针j分别指向区间的左节点和右节点。使用哈希表记录当前区间的覆盖情况,并根据指针的移动情况不断维护。若当前区间[i, j-1]不能够完全覆盖t,延申指针j右移,寻找可行解;若区间能够完全覆盖t,收缩指针i左移,寻找最短的解附上代码:class Solution {public: bool check(map<int,int>& m){ for(auto x : m ){ if(x.se.原创 2022-03-18 21:18:20 · 472 阅读 · 0 评论 -
Leetcode42 接雨水(dp,单调栈,双指针)
本题可以有三种解法:动态规划:对每一格注水,统计每个位置高度的左边最大值和右边最大值单调栈:按照层的方式注水,使用递减单调栈寻找注水区间双指针:两个指针从左边向中间移动,一次遍对每一格子注水动态规划:使用两个数组,分别遍历并记录每一位置左边高度的最大值,右边高度的最大值。最后每个位置内的雨水大小 min(leftmax[i],rightmax[i]) - height[i],求和得到输出。单调栈:栈自底向上坐标对应的高度,逐渐减小。当height[i] < stack.top()时,.原创 2021-12-21 16:23:55 · 359 阅读 · 0 评论 -
Leetcode15 三数之和
在nnn个数字中所有可能的三元组有 Cn3C^{3}_{n}Cn3 种。由于数组中含有重复元素,为保证结果的唯一性,对数组进行排序预处理。题目要求三个数的和未为一个定值,那么只需要确定前两个数,第三个数字也被确定。用两个for循环枚举可能的组合,第三个指针从最后一个数开始向前枚举,时间复杂度为 O(N2)O(N^2)O(N2)附上代码:class Solution {public: vector<vector<int>> threeSum(vector<.原创 2021-12-16 15:41:46 · 164 阅读 · 0 评论 -
Leetcode11 盛水最多的容器
方法:双指针【时间复杂度 O(N)O(N)O(N),空间复杂度 O(1)O(1)O(1)】与传统双指针方法不同,两个指针的移动方式是从两端向中间移动的。定义指针 i,j,初始分别指向第一个元素、最后一个元素。容器容积的计算公式:V = min(height[i],height[j]) * (j-i)指针更新:移动对应高度较小的指针(i左移,j右移)期间不断记录容积最大值。附上代码:class Solution {public: int maxArea(vector<int&g.原创 2021-12-13 16:47:27 · 1622 阅读 · 0 评论
分享