力扣-283-移动零
1.题目描述
2.题目链接
283. 移动零 - 力扣(LeetCode)
3.题目代码
class Solution {public void moveZeroes(int[] nums) {int dest=-1;int cur=0;while(cur<nums.length){if(nums[cur]==0){cur++;}else if(nums[cur]!=0){swap(nums,cur,dest+1);cur++;dest++;}}}public void swap(int[]nums,int i, int j){int temp=0;temp=nums[i];nums[i]=nums[j];nums [j]=temp;}
}
4.解题思路
1.定义两个指针。
2.在遍历cur的过程中,数组也就被分成了三个部分:
3.dest初始值为-1,cur初始值为0。
在还没有开始遍历的时候,最左边非零的区间就是0,因为还没有判断数组首元素是否非零。所以dest的初始位置就应该是在-1,这样非零元素也就是【0,-1】,也就不存在。
如果dest指针从0开始,那此时非零区间就是【0,0】,0号下标的元素也就直接被判断为非零元素。
而cur因为是进行遍历,所以cur从0开始。这是待处理区间是【0,nums.length-1】,也就是整个数组。
4.cur遍历数组
当cur遍历完数组后,也就是cur>=nums.length时,dest指针此时还在数组上,因此待处理区间:【cur,nums.length】就是空区间。
整个数组被dest指针分成了两个部分,一个是非零区间:【0,dest】,一个是零区间:【dest+1,cur-1】。这里的cur-1就是数组的最后一个元素,cur-1=numslength-1。
这时,我们就完成了这道题目的要求:所有非零元素在数组的左边,零元素在数组的右边。
5.题目思想
这道题目的思想是使用双指针,将整个数组划分为3个区间,通过对一个指针进行遍历,来完成题目的要求。
值得一提的是,这道题目的思想和快速排序有异曲同工之妙。
快速排序的思想是:通过假定一个元素temp,将所有小于temp的元素放在temp的左边,所有大于等于temp的元素放在temp的右边。
这道题目的temp也就是0,通过0作为临界值,来进行数组的划分。