2026/2/24 4:12:45
网站建设
项目流程
网站运营作用,特产网站模板,工业软件开发流程,网站建设会员管理系统方案#x1f525;个人主页#xff1a;Milestone-里程碑
❄️个人专栏: 力扣hot100 CLinux GitMySQL
#x1f31f;心向往之行必能至 题目描述
给定一个数组 nums#xff0c;编写一个函数将…个人主页Milestone-里程碑❄️个人专栏: 力扣hot100 CLinuxGitMySQL心向往之行必能至题目描述给定一个数组nums编写一个函数将所有 0 移动到数组的末尾同时保持非零元素的相对顺序。注意必须在不复制数组的情况下原地对数组进行操作。示例输入nums [0,1,0,3,12]输出[1,3,12,0,0]方法一双指针交换法思路我们可以用一个指针left来记录当前非零元素应该放置的位置然后遍历数组。当遇到非零元素时就将它与left位置的元素交换并让left指针右移。这样可以保证left指针之前的所有元素都是非零的且保持了原有顺序。代码实现cppclass Solution { public: void moveZeroes(vectorint nums) { int left 0; for (auto x : nums) { if (x ! 0) { swap(x, nums[left]); left; } } } };复杂度分析时间复杂度O (n)其中 n 是数组的长度。我们只需要遍历一次数组。空间复杂度O (1)只使用了常数级的额外空间。方法二覆盖补零法思路先遍历数组把所有非零元素依次覆盖到数组的前面用一个变量stack_size记录当前覆盖的位置。遍历完成后stack_size及之后的位置全部补零即可。代码实现cppclass Solution { public: void moveZeroes(vectorint nums) { int stack_size 0; // 第一步把非零元素移到前面 for (int x : nums) { if (x ! 0) { nums[stack_size] x; } } // 第二步后面的位置全部补零 while (stack_size nums.size()) { nums[stack_size] 0; } } };复杂度分析时间复杂度O (n)两次遍历数组总时间还是线性的。空间复杂度O (1)同样是原地操作。方法对比方法优点缺点双指针交换法只需一次遍历操作次数更少交换操作会多写几次赋值覆盖补零法逻辑直观容易理解需要两次遍历操作次数略多在进阶要求 “尽量减少操作次数” 时双指针交换法会更有优势。总结这道题的核心是原地修改和保持相对顺序两种方法都能满足要求。