题目链接: 移动零
有关题目
给定一个数组 nums,编写一个函数
将所有 0 移动到数组的末尾,
同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。
题解
法一:计数+补零
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int n = nums.size(), cnt = 0;
for (int i = 0; i < n; ++i){
if (nums[i] == 0){
++cnt;//计数
continue;
}
nums[i - cnt] = nums[i];//移动非零元素
}
while(cnt > 0){
nums[n - cnt] = 0;//补零
--cnt;
}
}
};
时间复杂度:O(N)
空间复杂度:O(1)
法二:双指针
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int n = nums.size();
int p = 0;
for (int i = 0; i < n; ++i){
if (nums[i] != 0){
swap(nums[p++], nums[i]);
}
}
}
};
时间复杂度:O(N)
空间复杂度:O(1)
本文介绍了两种在原数组上移动零的算法,保持非零元素相对顺序的方法。法一是计数加补零,法二是双指针。这两种方法都实现了在O(N)的时间复杂度和O(1)的空间复杂度内完成操作。
385

被折叠的 条评论
为什么被折叠?



