引言
在算法题中,双指针技巧是一类高频且实用的解题方法。它并非真正的'指针',而是通过两个数组下标(或迭代器)的协同移动,在数组划分、区间求解、环检测等场景中实现高效遍历与逻辑处理,往往能将时间复杂度从暴力法的 O(n^2) 优化至 O(n),是解决数组类难题的关键。
双指针概述
常用于:数组划分和数组分块
注意:这里的指针不是真的指针,是数组的下标
经典例题解析
移动零
题目链接: 283. 移动零
思路:
cur:从左往右遍历数组dest:已处理区间内,非零元素的最后一个位置

class Solution {
public:
void moveZeroes(vector<int>& nums) {
int dest = -1;
int cur = 0;
for (; cur < nums.size(); cur++) {
if (nums[cur] != 0) {
swap(nums[dest + 1], nums[cur]);
dest++;
}
}
}
};
复写零
题目链接: 1089. 复写零
思路:
- 先找到最后一个被复写的数。判断
cur位置的值,cur放到下标 0 位置,dest放到下标 -1 位置。 - 如果
dest超过最后那个数的位置,需特殊处理。 - 从后向前完成复写操作。
注意:
- vector 的
size()-1就是最后一个位置的下标,区分元素和下标。


