python(leetcode)-283移動零

給定一個數組 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) 可以發現確實速度快了很多

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章