音乐
音乐
暂未播放
0:00/0:00
暂无歌词
LeetCode | 双指针
981 字
5 分钟
LeetCode | 双指针
分类:双指针 / 总结
讲解#
双指针题目的核心是:用两个指针描述当前正在处理的位置或范围,然后根据规则移动指针。
移动零 的 left 和 right 一开始都在数组最左侧。right 不断向右扫描数组;当 right 看到非零数时,就把它交换到 left 指向的位置,然后 left 向右移动。最后数组前面是所有非零数,后面是所有 0。
盛最多水的容器 的 left 一开始在最左侧,right 一开始在最右侧。两个指针夹住一个容器,计算当前面积后,移动较短的那一边;如果右边更短就移动 right,如果左边更短就移动 left。最后返回最大面积。
三数之和 先排序并固定第一个数 nums[i],然后让 left 从 i + 1 开始,right 从数组最右侧开始,在右侧区间里找另外两个数。如果三数之和偏小,就移动 left;如果三数之和偏大,就移动 right;如果等于 0,就记录答案并同时移动两个指针。最后返回所有不重复的三元组。
接雨水 的 left 一开始在最左侧,right 一开始在最右侧,同时维护 left_max 和 right_max。如果左边高度更低,就结算 left 位置能接的水,然后移动 left;否则结算 right 位置能接的水,然后移动 right。最后返回总水量。
最长回文子串 的 left 和 right 一开始都指向同一个中心位置(偶数长度回文则指向相邻两个字符)。只要 s[left] 和 s[right] 相等,就不断向两侧扩展,记录扩展出的回文串;每个中心都试过后,返回最长的回文子串。
双指针题目重要是:两个指针分别代表什么,什么时候移动左边,什么时候移动右边。
代码#
移动零#
1from typing import List2
3
4class Solution:5 def moveZeroes(self, nums: List[int]) -> None:6 n = len(nums)7 left = right = 08 while right < n:9 if nums[right]:10 nums[left], nums[right] = nums[right], nums[left]11 left += 112 right += 1盛最多水的容器#
1from typing import List2
3
4class Solution:5 def maxArea(self, height: List[int]) -> int:6 left = 07 right = len(height) - 18
9 ans = 010 while left < right:11 if height[right] < height[left]:12 h = height[right]13 area = (right - left) * h14 if area > ans:15 ans = area16 right -= 117 while left < right and height[right] < h:18 right -= 119 else:20 h = height[left]21 area = (right - left) * h22 if area > ans:23 ans = area24 left += 125 while left < right and height[left] < h:26 left += 127
28 return ans三数之和(双指针)#
1from typing import List2
3
4class Solution:5 def threeSum(self, nums: List[int]) -> List[List[int]]:6 nums.sort()7 ans = []8 n = len(nums)9
10 for i in range(n - 2):11 if i > 0 and nums[i] == nums[i - 1]:12 continue13 if nums[i] > 0:14 break15
16 left = i + 117 right = n - 118 while left < right:19 total = nums[i] + nums[left] + nums[right]20 if total < 0:21 left += 122 elif total > 0:23 right -= 124 else:25 ans.append([nums[i], nums[left], nums[right]])26 left += 127 right -= 128 while left < right and nums[left] == nums[left - 1]:29 left += 130 while left < right and nums[right] == nums[right + 1]:31 right -= 132
33 return ans接雨水#
1from typing import List2
3
4class Solution:5 def trap(self, height: List[int]) -> int:6 ans = 07 left = 08 right = len(height) - 19 left_max = 010 right_max = 011
12 while left < right:13 left_max = max(left_max, height[left])14 right_max = max(right_max, height[right])15
16 if height[left] < height[right]:17 ans += left_max - height[left]18 left += 119 else:20 ans += right_max - height[right]21 right -= 122
23 return ans最长回文子串(中心扩展)#
1class Solution:2 def longestPalindrome(self, s: str) -> str:3 def expand(left: int, right: int) -> str:4 while left >= 0 and right < len(s) and s[left] == s[right]:5 left -= 16 right += 17 return s[left + 1:right]8
9 ans = ""10 for i in range(len(s)):11 odd = expand(i, i)12 even = expand(i, i + 1)13 ans = max(ans, odd, even, key=len)14 return ans参考资料#
- 移动零
- 盛最多水的容器
- 三数之和
- 接雨水
- 最长回文子串
- LeetCode 移动零:https://leetcode.com/problems/move-zeroes/
- LeetCode 盛最多水的容器:https://leetcode.com/problems/container-with-most-water/
- LeetCode 三数之和:https://leetcode.com/problems/3sum/
- LeetCode 接雨水:https://leetcode.com/problems/trapping-rain-water/
- LeetCode 最长回文子串:https://leetcode.com/problems/longest-palindromic-substring/
- 力扣移动零题解:https://leetcode.cn/problems/move-zeroes/solutions/489622/yi-dong-ling-by-leetcode-solution/
- 力扣盛最多水的容器题解:https://leetcode.cn/problems/container-with-most-water/solutions/11491/container-with-most-water-shuang-zhi-zhen-fa-yi-do/
- 力扣三数之和题解:https://leetcode.cn/problems/3sum/solutions/284681/san-shu-zhi-he-by-leetcode-solution/
- 力扣接雨水题解:https://leetcode.cn/problems/trapping-rain-water/solutions/692342/jie-yu-shui-by-leetcode-solution-tuvc/
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
相关文章智能推荐
1
LeetCode | 移动零
LeetCodeLeetCode 移动零题解:使用双指针原地移动零,同时保持非零元素相对顺序。
2
LeetCode | 接雨水
LeetCodeLeetCode 接雨水题解:理解每个位置的左右挡板,用双指针在线性时间内计算总积水量。
3
LeetCode | 哈希表
LeetCode整理 LeetCode 哈希表题目的核心思路:先建表,再查表。
4
LeetCode | 最长回文子串
LeetCodeLeetCode 最长回文子串题解:中心扩展法枚举每个奇偶中心向两侧扩展,时间复杂度 O(n²),空间复杂度 O(1)。
5
LeetCode | 盛最多水的容器
LeetCodeLeetCode 盛最多水的容器题解:使用双指针从两端向中间移动,计算能够装下的最大水量。
随机文章随机推荐
暂无随机文章
评论区
分享你的想法,与大家交流讨论
站点统计
文章
212
分类
26
标签
291
总字数
2,407,536
运行时长
0 天
最后活动
0 天前
最新动态
2026.09.18
你说,AI是不是新一次的工业革命呢
2026.09.04
过往皆是序章,前路漫有星光
2026.09.02
九月风至,赴约燕园
2026.07.06
岁次壬寅,序属季夏。负箧吴江,栖迟久泳。时维高考新败,登阊门而北望,临胥江以长嗟。昔者子安命蹇,尚能奋藻于滕阁;今吾才疏,岂可沉沦于吴市?乃焚膏以继晷,立雪而追贤。自暑月即研电学之微,探数理之奥。但求踔厉侪辈,砥砺锋芒。 洎乎素商既至,庠序始开。选修五门皆得满绩,总评冠绝同侪。然尘世难料,人心叵测。交非其人,悔吝丛生。一载相交,竟转瞬成参商。当是时也,恍若屈子见放,贾生受谗。然仲尼厄而作春秋,左丘眇而厥有国语。经此砥砺,竟愈宿疾:昔之曲意逢迎,今则坦荡自持;向之汲汲人言,今则泰然自若。所谓塞翁失马,焉知非福耶? 若夫玄冥司节,青阳启序。既专课业,复骋赛场。数模电赛,殚精竭虑;车赛集创,呕心镂骨。常观吴江夜月,每伴姑苏晨星。悬梁刺股,非为功名之累;凿壁囊萤,实怀鸿鹄之志。终使课业蝉联榜首,竞赛累获殊荣。然形神俱瘁,犹记寒宵病骨,强支案牍;伏暑昏眩,犹自深研不辍。 岁次甲辰,时逢白藏。绩点累年称冠,奖项盈箧成行。遂膺国奖之荣,如登龙门之津。乃遍谒名师,广求良策。拟鹏徙南冥,期凤鸣岐阳。幸得燕园李萌先生青眼,许列门墙。继入艾捷科芯实习,兼修毕业设计。两事交并,心力俱疲。承钟林峰师兄鼎力,终克难关。 今当辞别葑溪,将赴燕台。忆昔韩洪润学长,指迷津于暗夜;念吴圣洁挚友,伴苦读于寒窗。实乃天眷优渥,得遇诸君。昔者范公划粥,终成社稷之臣;欧母画荻,乃育文章之伯。予虽驽钝,敢不踵武前修?悟已往之不谏,知来者之可追。陶元亮归去来辞,实获我心;王子安穷且益坚,宁移素志?今将整装而北发,岂效楚囚之泣?当乘长风,破巨浪,展鸿图于未央!
日
一
二
三
四
五
六
文章目录
--
总访问量
--
访客数
公告
音乐
音乐
暂未播放
0:00/0:00
暂无歌词
站点统计
文章
212
分类
26
标签
291
总字数
2,407,536
运行时长
0 天
最后活动
0 天前
最新动态
2026.09.18
你说,AI是不是新一次的工业革命呢
2026.09.04
过往皆是序章,前路漫有星光
2026.09.02
九月风至,赴约燕园
2026.07.06
岁次壬寅,序属季夏。负箧吴江,栖迟久泳。时维高考新败,登阊门而北望,临胥江以长嗟。昔者子安命蹇,尚能奋藻于滕阁;今吾才疏,岂可沉沦于吴市?乃焚膏以继晷,立雪而追贤。自暑月即研电学之微,探数理之奥。但求踔厉侪辈,砥砺锋芒。 洎乎素商既至,庠序始开。选修五门皆得满绩,总评冠绝同侪。然尘世难料,人心叵测。交非其人,悔吝丛生。一载相交,竟转瞬成参商。当是时也,恍若屈子见放,贾生受谗。然仲尼厄而作春秋,左丘眇而厥有国语。经此砥砺,竟愈宿疾:昔之曲意逢迎,今则坦荡自持;向之汲汲人言,今则泰然自若。所谓塞翁失马,焉知非福耶? 若夫玄冥司节,青阳启序。既专课业,复骋赛场。数模电赛,殚精竭虑;车赛集创,呕心镂骨。常观吴江夜月,每伴姑苏晨星。悬梁刺股,非为功名之累;凿壁囊萤,实怀鸿鹄之志。终使课业蝉联榜首,竞赛累获殊荣。然形神俱瘁,犹记寒宵病骨,强支案牍;伏暑昏眩,犹自深研不辍。 岁次甲辰,时逢白藏。绩点累年称冠,奖项盈箧成行。遂膺国奖之荣,如登龙门之津。乃遍谒名师,广求良策。拟鹏徙南冥,期凤鸣岐阳。幸得燕园李萌先生青眼,许列门墙。继入艾捷科芯实习,兼修毕业设计。两事交并,心力俱疲。承钟林峰师兄鼎力,终克难关。 今当辞别葑溪,将赴燕台。忆昔韩洪润学长,指迷津于暗夜;念吴圣洁挚友,伴苦读于寒窗。实乃天眷优渥,得遇诸君。昔者范公划粥,终成社稷之臣;欧母画荻,乃育文章之伯。予虽驽钝,敢不踵武前修?悟已往之不谏,知来者之可追。陶元亮归去来辞,实获我心;王子安穷且益坚,宁移素志?今将整装而北发,岂效楚囚之泣?当乘长风,破巨浪,展鸿图于未央!



