双指针算法简介
双指针算法是解决算法题中常见的一种方法,主要分为对撞指针和快慢指针两种。
对撞指针
一般用于顺序结构,也叫左右指针。
实现思路:
- 对撞指针从序列两端向中间移动。
- 终止条件一般是两个指针相遇或错开。
快慢指针
又称龟兔赛跑算法,使用两个移动速度不同的指针在序列上移动。常用于环形链表或数组中。
实现思路:
- 研究问题是否有循环往复的现象。
- 设置一个快指针和一个慢指针,例如让快指针移动两步,慢指针移动一步。
相关例题
题目一:移动零
题目描述
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。必须在不复制数组的情况下原地对数组进行操作。
示例 1:
输入:nums = [0,1,0,3,12]
输出:[1,3,12,0,0]
示例 2:
输入:nums = [0]
输出:[0]
提示:
1 <= nums.length <= 10^4-2^31 <= nums[i] <= 2^31 - 1
实现思路
思路一
统计非零数的个数,将非零数依次交换到数组开头。
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int cnt = 0;
for (auto& s : nums) {
if (s == 0) cnt++;
}
cnt = nums.size() - cnt;
int k = 0;
( i = ; i < nums.(); i++) {
(nums[i] != ) {
(nums[i], nums[k++]);
}
(k > cnt) ;
}
}
};


