ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

【C++】算法双指针算法1

2026/9/4 18:46:32 拓冰建站 浏览量
【C++】算法双指针算法1 题目描述题目来源力扣「移动零」题目描述给定一个数组nums编写一个函数将所有0移动到数组的末尾同时保持非零元素的相对顺序。请注意必须在不复制数组的情况下原地对数组进行操作。算法原理数组划分数组分块将一个数组按照标准划分为若干子块双指针算法利用数组下标充当指针两个指针的作用cur从前往后依次遍历数组元素dest已处理的区间内非零元素的最后一个位置划分为三个区间[0,dest],[dest1,cur-1],[cur,n-1][0,dest]非零元素 [dest1,cur-1]零元素 [cur,n-1]待处理的元素具体原理cur 从前往后遍历数组1. 遇到 0 元素cur2. 遇到非零元素让 dest 先 然后让 dest 与 cur 交换cur。实操class Solution { public: void moveZeroes(vectorint nums) { // 双指针法cur 负责遍历dest 指向已处理区间中最后一个非零元素的位置 int cur 0; // cur 指针从前往后依次扫描数组的每一个元素 int dest -1; // dest 指针初始为 -1表示当前还没有找到非零元素 // 让 cur 从下标 0 开始一直遍历到数组末尾 for (int cur 0; cur lt; nums.size(); cur) { // 如果当前元素 nums[cur] 是非零元素0 为假非 0 为真 if (nums[cur]) // 处理非零元素 { // 先让 dest 向后移动一位dest // 因为 dest 要指向下一个可以放置非零元素的位置 // 然后交换 dest 和 cur 位置上的元素 // 把非零元素换到前面把 0 换到后面 swap(nums[dest], nums[cur]); // 交换完成后cur 会在 for 循环中自动 继续向后扫描 } // 如果当前元素是 0则什么都不做 // cur 在 for 循环中自动 继续向后扫描下一个元素 } } };复杂度分析该双指针解法的时间复杂度为O(n)空间复杂度为O(1)。时间复杂度cur 指针从前往后遍历整个数组每个元素最多被访问一次因此整体耗时与数组长度 n 成正比为 O(n)。空间复杂度整个过程只使用了 cur 和 dest 两个额外变量没有借助任何辅助数组或容器因此额外空间为常数级别即 O(1)。