题目
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。
自己第一次解题:
class Solution { public void moveZeroes(int[] nums) {//定义一个指针从0开始,如果数组中的数不是0,指针加一。如果是先把后边的都向前移动 int i=0; int n=nums.length; int m=n-1; while(i<=m){ if(nums[i]==0){ for(int j=(n-(i+1));j>0;j--){ nums[i]=nums[i+1]; i++; } nums[m]=0; } else{ i++;} } } }
结果:
用时太长,时间复杂度高.知道用指针,但只用一个指针。并在看解析时,两个指针的解题思路较为陌生。
官方答案:
class Solution { public void moveZeroes(int[] nums) { int n = nums.length, left = 0, right = 0; while (right < n) { if (nums[right] != 0) { swap(nums, left, right); left++; } right++; } } public void swap(int[] nums, int left, int right) { int temp = nums[left]; nums[left] = nums[right]; nums[right] = temp; } }