双指针-力扣hot100-移动零.283

可以用「双指针」一次遍历,时间复杂度 O(n)、空间复杂度 O(1),满足原地修改和保持相对顺序的要求。

思路:

  • 用一个指针 slow 指向当前应该放"下一个非零元素"的位置。

  • 用另一个指针 fast 从头到尾遍历数组:

    • 每当 nums[fast] != 0,就把该非零元素放到 nums[slow],然后 slow++
  • 第一遍结束后,slow 之前的元素都是按原顺序排好的非零元素。

  • 接下来从 slow 到数组末尾全部填 0 即可。

这样能保证:

  • 所有非零元素的相对顺序不变(因为我们按原顺序从左到右拷贝过去)。

  • 0 都被集中到末尾。

  • 原地操作,只使用了常数额外空间。

代码实现(C++)

复制代码
class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int n = nums.size();
        int slow = 0; // 指向下一个应该放非零元素的位置

        // 1. 把所有非零元素按原顺序移动到前面
        for (int fast = 0; fast < n; ++fast) {
            if (nums[fast] != 0) {
                nums[slow] = nums[fast];
                ++slow;
            }
        }

        // 2. slow 之后填充为 0
        while (slow < n) {
            nums[slow] = 0;
            ++slow;
        }
    }
};
复杂度分析
  • 时间复杂度:O(n),只遍历了一次数组,再加一次填 0。

  • 空间复杂度:O(1),未使用额外数组,原地修改。

相关推荐
2401_841495644 分钟前
【LeetCode刷题】二叉树的直径
数据结构·python·算法·leetcode·二叉树··递归
budingxiaomoli5 分钟前
优选算法-字符串
算法
我是咸鱼不闲呀19 分钟前
力扣Hot100系列19(Java)——[动态规划]总结(上)(爬楼梯,杨辉三角,打家劫舍,完全平方数,零钱兑换)
java·leetcode·动态规划
学历真的很重要20 分钟前
【系统架构师】第二章 操作系统知识 - 第二部分:进程与线程(补充版)
学习·职场和发展·系统架构·系统架构师
qq74223498423 分钟前
APS系统与OR-Tools完全指南:智能排产与优化算法实战解析
人工智能·算法·工业·aps·排程
A尘埃1 小时前
超市购物篮关联分析与货架优化(Apriori算法)
算法
.小墨迹1 小时前
apollo学习之借道超车的速度规划
linux·c++·学习·算法·ubuntu
不穿格子的程序员1 小时前
从零开始刷算法——贪心篇1:跳跃游戏1 + 跳跃游戏2
算法·游戏·贪心
大江东去浪淘尽千古风流人物1 小时前
【SLAM新范式】几何主导=》几何+学习+语义+高效表示的融合
深度学习·算法·slam
hqyjzsb1 小时前
盲目用AI提效?当心陷入“工具奴”陷阱,效率不增反降
人工智能·学习·职场和发展·创业创新·学习方法·业界资讯·远程工作