題目地址:https://leetcode-cn.com/problems/move-zeroes/java
給定一個數組 nums
,編寫一個函數將全部 0
移動到數組的末尾,同時保持非零元素的相對順序。算法
示例:數組
輸入: [0,1,0,3,12] 輸出: [1,3,12,0,0]
說明:函數
輸入:數組指針
輸出:數組(將原數組的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)後者略優一點循環