LeetCode-283 零移動

題目描述:給定一個數(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運行結(jié)果如下:

![_V3T]R%@SWP1EK0CUS~)F33.png](https://upload-images.jianshu.io/upload_images/8551754-37fb3db48f4ac545.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

X}Y60Q(_K`YXCA(IYR1RJ9K.png

感覺在將為0元素移動到數(shù)組最末做了大量無用操作,遂改進一番。

先定義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運行情況如下:


I@$2)F4PCIJHBO{NK7[U]Y1.png

[圖片上傳失敗...(image-74420-1556175387692)]

分析 這種方式 對整個數(shù)組只是循環(huán)了一次,對只是為0的元素進行了對換,效率大大提升。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容