1. 算法思想解析
1.1 什么是尺取法
尺取法(Two Pointers Technique)是一种通过维护动态窗口来优化遍历效率的算法策略。想象你手里拿着一把可以伸缩的尺子,在数据序列上左右滑动测量。这种方法特别适合处理需要考察连续子序列的问题,比如在字符串中寻找不含重复字符的最长子串,或在数组中寻找满足特定条件的连续子数组。
与暴力枚举所有可能子序列的O(n²)复杂度相比,尺取法通常能将时间复杂度降至O(n)。这是因为它避免了重复计算——通过智能地调整窗口边界,而不是每次都从头开始扫描。
1.2 核心操作原理
算法的核心在于维护一对指针(左指针left和右指针right),它们分别代表窗口的左右边界。基本操作流程如下:
- 初始化时,两个指针都指向序列起始位置
- 右指针逐步向右扩展,直到窗口内元素满足特定条件
- 当条件满足时,左指针开始向右收缩,尝试找到更优解
- 重复步骤2-3直到遍历完整个序列
这个过程中需要维护一些状态变量来跟踪窗口内的关键信息。例如在"最长无重复子串"问题中,我们需要一个哈希集合来记录当前窗口内的字符分布。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 典型应用场景拆解
2.1 字符串类问题
在处理字符串问题时,尺取法展现出强大的威力。以LeetCode第3题为例,寻找最长无重复字符子串的解法如下:
python复制def lengthOfLongestSubstring(s: str) -> int:
char_set = set()
left = 0
max_len = 0
for right in range(len(s)):
while s[right] in char_set:
char_set.remove(s[left])
left += 1
char_set.add(s[right])
max_len = max(max_len, right - left + 1)
return max_len
这个实现中,我们维护一个滑动窗口和字符集合。右指针每次移动时,如果遇到重复字符,就收缩左指针直到消除重复。时间复杂度严格控制在O(
