題目描述:給定一個數(shù)組 nums,編寫一個函數(shù)將所有 0 移動到數(shù)組的末尾识颊,同時保持非零元素的相對順序。
示例:
輸入: [0,1,0,3,12]
輸出: [1,3,12,0,0]
說明:
必須在原數(shù)組上操作,不能拷貝額外的數(shù)組彼城。
盡量減少操作次數(shù)。
拿到這個題目的第一想法就是退个,從數(shù)組的末尾開始募壕,將為0的元素移動棟數(shù)組的最后代碼如下:
/**
* 從數(shù)組的末位開始,將為0的元素 移動到最末尾
* @param nums 傳入?yún)?shù)
*/
private static void moveArray(int[] nums) {
if (nums == null || nums.length == 0) {
return ;
}
for (int i = nums.length - 1; i >= 0; i--) {
if (nums[i] == 0) {
for (int j = i; j < nums.length - 1; j++) {
int temp = nums[j];
nums[j] = nums[j + 1];
nums[j + 1] = temp;
}
}
}
}
提交LeetCode運(yùn)行結(jié)果如下:
![_V3T]R%@SWP1EK0CUS~)F33.png](https://upload-images.jianshu.io/upload_images/8551754-37fb3db48f4ac545.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
感覺在將為0元素移動到數(shù)組最末做了大量無用操作语盈,遂改進(jìn)一番舱馅。
先定義m,n兩個數(shù)刀荒,m為非0元素的長度代嗤,n為當(dāng)前循環(huán)到的數(shù)組長度,代碼如下:
private static void moveArray0(int[] nums) {
if (nums == null || nums.length == 0) {
return ;
}
//定義 定義m缠借,n兩個數(shù)干毅,m為非0元素的長度,n為當(dāng)前循環(huán)到的數(shù)組長度
int m = 0,n = 0;
for (int i = 0;i < nums.length;i++){
if (nums[i] == 0){
//記錄當(dāng)前循環(huán)到的數(shù)組長度
n++;
}else {
//若數(shù)組當(dāng)前元素非0泼返,將數(shù)組中m位置 變成當(dāng)前非0元素
if (n - m > 0){
int x = nums[m];
nums[m] = nums[i];
nums[i] = x;
}
//記錄當(dāng)前循環(huán)到的數(shù)組長度
n++;
//非0數(shù)組長度
m++;
}
}
}
提交LeetCode運(yùn)行情況如下:
[圖片上傳失敗...(image-74420-1556175387692)]
分析 這種方式 對整個數(shù)組只是循環(huán)了一次硝逢,對只是為0的元素進(jìn)行了對換,效率大大提升。