283. 移动零

Introduction

Question: 283. 移动零

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

示例:

输入: [0,1,0,3,12]
输出: [1,3,12,0,0]

说明:

  1. 必须在原数组上操作,不能拷贝额外的数组。
  2. 尽量减少操作次数。

解法一

Analysis

有点像是插入排序,保证nums[0:j]之间的元素是已经处理过的,同时nums[i:j]之间的元素为0。然后尝试将nums[j]插入进去,如果nums[j] == 0,则无需处理,移动j即可;如果nums[j] != 0,则swap(nums[j], nums[i]),同时移动ij

事实上还能用归并排序类似的方式做,但是太傻比了。。。

Implement

1
2
3
4
5
6
7
8
9
void moveZeroes(vector<int>& nums) {
for(int i = 0, j = 0; j < nums.size(); j++) {
if (nums[j] != 0) {
swap(nums[i], nums[j]);
i++;
}
}
// moveZeroes(nums, 0, nums.size() - 1);
}