对撞:每步排掉一头
有序数组找两数之和:l 指最左、r 指最右,循环 while (l < r)。和比目标小就 l++(左边的数变大),和比目标大就 r--(右边的数变小),相等就是答案。每一步都安全排除一个数,一趟 O(n) 搞定。注意边界一般写 l < r 不写 <=,否则会把同一个数自己加自己。
C 特色:真指针版
同一个算法可以写成 int *p = nums, *q = nums + 5;——p 指向第一个元素、q 指向最后一个,*p 解引用取值,p++ 移动的是地址。关键认知:指针算术按元素不按字节,int 指针加 1 自动跳过 4 字节,正好挪到下一格。「双指针」在 C 里是字面意思,两版逻辑完全等价,用哪个看习惯。
滑窗:一加一减平移区间
求长度为 k 的连续子数组最大和:右端 sum += nums[r] 进窗口,窗口满了(r >= k)就 sum -= nums[r - k] 把最左的减掉,和不用重算。选型口诀:题目找「一对数」(通常有序)用对撞;找「一段连续区间」的和、长度、计数用滑窗。都是 O(n) 时间、O(1) 空间。