給定一個數組 nums,編寫一個函數將所有 0 移動到數組的末尾,同時保持非零元素的相對順序。
示例:
輸入: [0,1,0,3,12]
輸出: [1,3,12,0,0]
說明:
- 必須在原數組上操作,不能拷貝額外的數組。
- 儘量減少操作次數。
解題思路:
使用雙指針法,一個指針 vInd 指向非零值,一個指針zInd指向零,當vInd<=zInd不做交換,且向後移動vInd指針直到大於zInd,如果符合交換條件即可交換兩個位置上的值,這一步可以直接將 vInd位置的值賦給zInd的位置上, 然後vInd位置上直接賦值0,,其他的就是判斷條件是否滿足vInde 和 zInd所指向的值,不滿足則移動指針至滿足。
時間上擊敗 96.06% 人 1ms
空間上擊敗 40-63% 左右 42MB ~ 40.3MB
代碼
class Solution {
public void moveZeroes(int[] nums) {
int zIn = 0;
int vIn = 0;
int i = 0;
if(nums.length == 1){
return;
}
while(vIn<nums.length&&zIn<nums.length){
if(nums[zIn]==0&&nums[vIn]!=0&&zIn<vIn){
nums[zIn] = nums[vIn];
nums[vIn] = 0;
zIn++;
vIn++;
}
while(zIn<nums.length&&nums[zIn]!=0){
zIn++;
}
while(vIn<nums.length&&nums[vIn] == 0){
vIn++;
}
while(vIn<=zIn){
vIn++;
}
}
}
}