周賽318。一直想著移動完0之後,若有兩個相鄰元素又相等,到底要不要再次操作?看來是我想太多。

題目

輸入大小為n,由非負整數組成的陣列nums。
你需要對該陣列執行n-1次操作,在第i次操作中:

  • 如果nums[i] == nums[i+1],則將nums[i]乘以2,並將nums[i+1]設為0;否則跳過此次操作

執行完所有操作後,將所有的移到陣列的末端。

  • 例如數組[1,0,2,0,0,1]變成[1,2,1,0,0,0]

回傳操作後的陣列。注意,一次只能對一個索引i執行操作,而非同時對全部索引操作。

解法

先照著題意,把相鄰且相同的數字合併到左邊,右邊歸零。最後初始化長度n的空陣列,依序把非零元素寫進去後回傳。

時空間複雜度O(N)。

class Solution:
    def applyOperations(self, nums: List[int]) -> List[int]:
        N=len(nums)
        
        for i in range(N-1):
            if nums[i]==nums[i+1]:
                nums[i]*=2
                nums[i+1]=0
        
        ans=[0]*N
        write=0
        for n in nums:        
            if n!=0:
                ans[write]=n
                write+=1
        
        return ans

也可以不需要額外空間,直接在原陣列寫入新值。

時間複雜度O(N),空間複雜度O(1)。

class Solution:
    def applyOperations(self, nums: List[int]) -> List[int]:
        N=len(nums)
        
        write=0
        for i in range(N):
            if i+1<N and nums[i]==nums[i+1]:
                nums[i]*=2
                nums[i+1]=0
            if nums[i]:
                nums[write]=nums[i]
                write+=1
                
        while write<N:
            nums[write]=0
            write+=1
        
        return nums