Practice makes perfect.
01 | 👑 题目描述
给你一个数组,把数组中所有的0移动到数组的首部,其他数字的相对顺序不能改变
02 | 🔋 解题思路
要将数组中的所有0移动到数组的首部,同时保持其他数字的相对顺序不变,可以采用以下解题思路和流程:
- 创建一个新的数组
result
,长度与给定数组nums
相同。 - 初始化两个指针:
i
和j
。 - 遍历给定数组
nums
:- 如果当前数字不为0,则将其放入
result
数组中,并将指针i
向后移动一位。 - 如果当前数字为0,则将其丢弃。
- 如果当前数字不为0,则将其放入
- 当遍历完成后,将剩余的位置都填充为0,以确保所有的0都移动到了数组的首部。
时间 && 空间复杂度
- 时间复杂度:O(n) ,其中 n 是数组的长度
遍历给定数组 nums 需要 O(n) 的时间复杂度 - 空间复杂度:O(n) ,其中 n 是数组的长度
额外创建了一个与给定数组 nums 长度相同的结果数组 result,因此额外的空间占用为 O(n)
03 | 🧢 代码片段
#include <iostream>
#include <vector>
using namespace std;
void moveZeroes(vector<int>& nums) {
vector<int> result(nums.size(), 0); // 初始化结果数组,长度与给定数组相同
int i = 0; // 指向结果数组的指针
for (int j = 0; j < nums.size(); ++j) {
if (nums[j] != 0) {
result[i++] = nums[j];
}
}
nums = result; // 将结果数组赋值给给定数组
}
int main() {
vector<int> nums = {0, 1, 0, 3, 12};
cout << "原始数组: ";
for (int num : nums) {
cout << num << " ";
}
cout << endl;
moveZeroes(nums);
cout << "移动零后的数组: ";
for (int num : nums) {
cout << num << " ";
}
cout << endl;
return 0;
}