LeetCode初級算法之數組:283 移動零

移動零

題目地址:https://leetcode-cn.com/problems/move-zeroes/java

給定一個數組 nums,編寫一個函數將全部 0 移動到數組的末尾,同時保持非零元素的相對順序。算法

示例:數組

輸入: [0,1,0,3,12]
輸出: [1,3,12,0,0]

說明:函數

  1. 必須在原數組上操做,不能拷貝額外的數組。
  2. 儘可能減小操做次數。

題目信息

輸入:數組指針

輸出:數組(將原數組的0都移動到後面)code

額外:空間O(1),時間儘可能減小leetcode

思考

對於這樣一道題一開始看到要原地修改首先就想到了雙指針遍歷一次把不是零的往前設置。後面的再所有設置0,這樣獲得的算法也是知足空間複雜度O(1),時間複雜度O(n).get

public void moveZeroes(int[] nums) {
    int j = 0;
    for(int i=0;i<nums.length;i++){
        if(nums[i] != 0){
            nums[j]=nums[i];
            j++;
        }
    }
    while(j<nums.length){
        nums[j] = 0;
        j++;
    }
}

兩次循環執行時間0ms,這樣就已經算是完美解決了。但確實還能夠只花一次循環就能解決,咱們在遍歷過程中是保證其餘順序不變而後零到後面。上面的想法不就是掃描非0而後掃描一個就往前面設置而後指針移動一。那麼一樣咱們去肯定零的位置而後交換始終保證數字在最左零的左邊便可class

public void moveZeroes(int[] nums) {
    //兩個指針i和j
    int j = 0;
    for(int i=0;i<nums.length;i++) {
        //當前元素!=0,就把其交換到左邊,等於0的交換到右邊
	if(nums[i]!=0) {
	    int tmp = nums[i];
	    nums[i] = nums[j];
    	    nums[j++] = tmp;
	}
    }
}

總結

整體來說兩種方式都是空間複雜度爲O(1)的原地算法,時間複雜度也都爲O(n)後者略優一點循環

相關文章
相關標籤/搜索