給定一個數組 nums,編寫一個函數將所有 0 移動到數組的末尾,同時保持非零元素的相對順序。
示例:
輸入: [0,1,0,3,12]
輸出: [1,3,12,0,0]
說明:
必須在原數組上操作,不能拷貝額外的數組。
儘量減少操作次數。
說下拿到這道題時的思路:
給人的感覺並不難,首先的想法就是遍歷數組中每一個元素,判斷如果爲0則刪除,同時末尾增加0
上代碼(通過240ms)擊敗20%的用戶
1 class Solution:
2 def moveZeroes(self, nums):
3 """
4 :type nums: List[int]
5 :rtype: void Do not return anything, modify nums in-place instead.
6 """
7 for i in nums:
8 if(i==0):
9 nums.remove(i)
10 nums.append(0)
11
12
13 if __name__=="__main__":
14 s=Solution()
15 nums=[0,1,0,3,12]
16 print(s.moveZeroes(nums))
代碼非常簡潔,只有短短4行,但是對比其他方法效率卻不高,
分析代碼的時間複雜度
外層for循環需要N次,remove(i)需要N次,append()方法1次
所以時間複雜度爲O(n^2)
換一種方法,上代碼(通過) 56ms 擊敗99%
在學習過程中有什麼不懂得可以加
我的python學習交流扣扣qun,688244617
羣裏有不錯的學習教程、開發工具與電子書籍。
與你分享python企業當下人才需求及怎麼從零基礎學習好python,和學習什麼內容。
1 class Solution:
2 def moveZeroes(self,nums):
3 """
4
5 :param nums:
6 :return:
7 """
8 count=0
9 zero=0
10 for i in range(len(nums)):
11 if(nums[i]!=0): #判斷是否爲0
12 nums[count]=nums[i] #不是0的數向前移
13 count+=1 #移動一個 計數加一
14 else:
15 zero+=1
16 for j in range(count,len(nums)): #把最後位置補0
17 nums[j]=0
18 return nums
19 if __name__=="__main__":
20 s=Solution()
21 nums=[0,1,0,3,12]
22 print(s.moveZeroes(nums))
思路在代碼中有註釋
分析下時間複雜度:
for循環有N次,if語句1次,賦值語句1次,++1次
第二個for循環N次,賦值語句1次
兩個for循環是並列關係 所以時間複雜度爲O(n) 可以發現確實速度快了很多