本题来自 LeetCode:283. 移动零[1]
题目描述
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。
题目分析
采用双指针,一个慢指针(记录当前无
0
值的数组长度),一个快指针(用来遍历整个数组)。用快指针位置的值和
0
比较,若相等,则移动该元素到慢指针的位置上,同时也需要将快指针的位置补
0
;否则继续比较快指针的下一个值。
题目解答
解法一
class Solution {
public void moveZeroes(int[] nums) {
int count = 0;
for(int i = 0; i nums.length; i ++) {
if(nums[i] != 0) {
nums[count ++] = nums[i];
if(count = i) {
nums[i] = 0;
}
}
}
}
}
复杂度分析:
时间复杂度:
O(n)
空间复杂度:
O(1)
解法二
也可以第一次遍历只移动不为
0
的元素,第二次遍历将后面的位置补
0
;
class Solution {
public void moveZeroes(int[] nums) {
int count = 0;
for(int i = 0; i nums.length; i ++) {
if(nums[i] != 0) {
nums[count ++] = nums[i];
}
}
for(int i = count; i nums.length; i ++) {
nums[i] = 0;
}
}
}
复杂度分析:
时间复杂度:
O(n)
空间复杂度:
O(1)
参考资料
原文始发于微信公众号(xiaogan的技术博客):