283.移动零
给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例 1:
输入: nums =
[0,1,0,3,12]
输出:
[1,3,12,0,0]
示例 2:
输入: nums =
[0]
输出:
[0]
提示:
1 <= nums.length <= 104
-231 <= nums[i] <= 231 - 1
思路
这道题目,使用暴力的解法,可以两层for循环,模拟数组删除元素(也就是向前覆盖)的过程。
双指针法在数组移除元素中,可以达到O(n)的时间复杂度,刷题之Leetcode27题(超级详细)-CSDN博客里已经详细讲解了,那么本题和移除元素其实是一个套路。
相当于对整个数组移除元素0,然后slowIndex之后都是移除元素0的冗余元素,把这些元素都赋值为0就可以了。
代码如下:
public void moveZeroes(int[] nums) { int slow = 0; for (int fast = 0; fast < nums.length; fast++) { if (nums[fast] != 0) { nums[slow++] = nums[fast]; } } // 后面的元素全变成 0 for (int j = slow; j < nums.length; j++) { nums[j] = 0; } }