leetcode陣列練習題2:283. 移動零

彭頭垢面發表於2020-11-30
給定一個陣列 nums,編寫一個函式將所有 0 移動到陣列的末尾,同時保持非零元素的相對順序。
示例:
輸入: [0,1,0,3,12]
輸出: [1,3,12,0,0]

說明:
必須在原陣列上操作,不能拷貝額外的陣列。
儘量減少操作次數。
通過次數277,991提交


雙指標 解法

這是之前寫的O(n) 的 時間複雜度解法,空間複雜度我忘了咋算了今晚回去補補

  1. 空指標判斷,和陣列為空退出
  2. 這題不需要排序只需要將非零元素與等零元素交換位置即可。

雙指標體現在哪裡呢,這裡面有 i 和 j 兩個變數, i 是隨著迴圈自增 而 j 是隨著滿足條件自增,就構成了快慢兩個指標;交換的時候會出現 i 和 j 相等且不等於零的時候,比如 {1,1,1,0}; 程式還是會進入if判斷執行浪費時間,能否避免這種情況呢 ?

目前我認為不能,因為不能確定 0 出現的位置。

void moveZeroes(int* nums, int numsSize)
{
    if(nums==NULL || numsSize==0)
        return;
    
    int j=0;
    for(int i = 0;i<numsSize;i++)
    {
        if(nums[i]!=0)
        {
            int temp = nums[i];
            nums[i] = nums[j];
            nums[j++] = temp;
        }
    }
}

提交記錄

相關文章