大家好!我是曾续缘💋
今天是《LeetCode 热题 100》系列
发车第 4 天
双指针第 1 题
❤️点赞 👍 收藏 ⭐再看,养成习惯
移动零 给定一个数组
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
进阶:你能尽量减少完成的操作次数吗?
难度:❤️
思路
如果我们开一个新数组,然后从头到尾遍历原数组,将非零元素搬到新数组中,这样非零元素的相对顺序不会改变,最后在新数组后加上0
元素的个数,便可以实现移动0的效果了。但是这样不满足”原地对数组进行操作“的要求。
可以看到,新数组的元素都来自原数组并且是非零的,那么在遍历原数组的过程中,新数组的元素个数一定不会多于原数组,也就可以看成是新数组在追原数组,既然追不上,那不如直接在原数组上追,这样又不会影响原数组的遍历。
解题方法
使用j
指针指向非零元素的末尾, i
指针表示当前遍历的数, 如果当前遍历的数非零, 就赋值到j
指针处, 在遍历期间, 指针j
是不会超过指针i
的. 遍历完后, 将非零元素的末尾全部赋值为0.
Code
class Solution {public void moveZeroes(int[] nums) {int j = 0;for(int i = 0; i < nums.length; i++){if(nums[i] != 0){nums[j++] = nums[i];}}for(int i = j; i < nums.length; i++){nums[i] = 0;}}
}