在处理数组相关算法时,双指针(Two Pointers)能够巧妙地利用区间单调性或位置关系,将原本需要 O(n^2) 的暴力搜索优化至 O(n)。本文精选四道经典题型,附带代码注释。
一、移动零 (Move Zeroes) —— 快慢指针
1. 算法思路
- 慢指针 (slow):指向'下一个非零元素应该存放的位置'。
- 快指针 (fast):遍历数组,寻找非零元素。
- 通过交换,非零元素被'推'到前面,零自然被'挤'到了后面。
2. Java 代码实现
class Solution {
public void moveZeroes(int[] nums) {
// slow 指针之前(不含 slow)全是非零数
int slow = 0;
for (int fast = 0; fast < nums.length; fast++) {
// 当快指针发现非零数时
if (nums[fast] != 0) {
// 如果快慢指针不相等,说明中间有 0,需要交换
if (fast > slow) {
int temp = nums[slow];
nums[slow] = nums[fast];
nums[fast] = temp;
}
// 无论是否交换,slow 都要后移,因为当前 slow 位置已被非零数占据
slow++;
}
}
}
}
二、盛最多水的容器 (Container With Most Water) —— 左右指针
1. 算法思路
- 核心原理:木桶效应。容量由'短板'决定。
- 指针移动逻辑:若移动长板,宽度减小,高度依然受限于短板,容量只会变小;只有移动短板,才可能换来更高的高度。
2. Java 代码实现
class Solution {
public {
, right = height.length - ;
;
(left < right) {
Math.min(height[left], height[right]) * (right - left);
max = Math.max(max, currentArea);
(height[left] < height[right]) {
left++;
} {
right--;
}
}
max;
}
}


