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作為臨界值,來進行數組的劃分。?