原题链接:移动零
个人解法
思路:
类似冒泡排序的想法,两两比较将0移到末尾。
时间复杂度: O ( ) n 2 O()n^2 O()n2
代码:
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int n = nums.size();
for(int k = 1;k < n;k ++) {
bool fg = 0;
for(int i = 0;i < n - k;i ++) {
if(nums[i] == 0) {
swap(nums[i], nums[i + 1]);
fg = 1;
}
}
if(!fg) break;
}
return;
}
};
更好的解法
二次遍历
思路:
将所有非0的元素往前移,那么剩下的元素全部赋值0.
时间复杂度: O ( n ) O(n) O(n)
代码:
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int n = nums.size();
int i, j;
for(i = 0, j = 0;j < n;j ++) {
if(nums[j]) nums[i ++] = nums[j];
}
while(i < n) nums[i ++] = 0;
}
};
一次遍历
思路:
类似二分排序的想法,将不等于0的都放到0的左边,等于0的都放到0的右边。
时间复杂度: O ( n ) O(n) O(n)
代码:
class Solution {
public:
void moveZeroes(vector<int>& nums) {
for(int i = 0,j = 0;i < nums.size();i ++) {
if(nums[i] != 0) {
swap(nums[i], nums[j]);
j ++;
}
}
}
};