題目鏈接?力扣
class Solution:def moveZeroes(self, nums: List[int]) -> None:l=0for r in range(len(nums)):if nums[r]:nums[l], nums[r] = nums[r], nums[l]l += 1return nums
方法一:
思路
雙指針
1. def moveZeroes(self, nums: List[int]) -> None:
定義了一個名為moveZeroes
的方法,該方法接受一個名為nums
的整數列表作為參數。該方法的返回類型被指定為None
,意味著這個方法不會返回任何值,而是直接在輸入的nums
列表上進行修改。
2. l=0
初始化一個名為l
的變量,作為左指針(或“慢”指針),用于跟蹤最近的非零元素應該被放置的位置。for r in range(len(nums)):
使用一個名為r
的變量(右指針或“快”指針)遍歷nums
列表的所有索引。
3. if nums[r]:
檢查當前r
指向的元素是否非零。如果是非零元素,執行以下操作:
a. nums[l], nums[r] = nums[r], nums[l]
交換l
和r
指向的元素。這實際上將非零元素移動到數組的前面,同時保持它們原有的相對順序。
b. l += 1
將l
(左指針)向右移動一位,因為我們剛剛在l
的位置放置了一個非零元素,所以下一個可能的非零元素的位置應該是l + 1
。
4. return nums
雖然方法的返回類型被指定為None
,但這里返回了修改后的nums
列表。這不是必須的,因為nums
列表是在原地被修改的,但這樣做可以在測試或調試時方便查看方法的效果。
時間復雜度為:O(n)
方法2:
Bubble Sort
那怎么知道有序呢?其實很簡單,就是第二層 for 循環的時候,沒有交換的元素。
所以呢,這里就增加一個 flag 數組,如果第二層循環沒有交換元素的時候,證明數組已經排序好了,不需要再繼續遍歷,直接返回就好了。
def bubbleSort(nums):# 數組長度n = len(nums)# 遍歷數組中的元素(n 次冒泡操作)for i in range(n):# 標志位,檢查是否發生元素交換flag = False# 每次冒泡操作中比較每個元素for j in range(n - i - 1):# 比較相鄰元素大小(升序)if nums[j] > nums[j + 1]:# 如果左邊大于右邊,就交換順序nums[j], nums[j + 1] = nums[j + 1], nums[j]# 如果發生交換,證明還不是有序,繼續遍歷flag = True# 如果不發生交換,證明數組已經有序,直接跳出循環 if not flag:break# 返回數組 return nums
實現邏輯:
- 新代碼通過比較相鄰元素并在發現0時將其向后交換,逐步將0移動到數組的末端。這個過程在每一輪循環中都會重復,直到所有的0都被移動到末尾。
- 之前的方法通過使用兩個指針(一個快指針和一個慢指針)來避免不必要的比較和交換。當快指針指向的元素非0時,它會與慢指針指向的元素交換位置,然后慢指針前進一位。這樣可以保證所有非0元素都被移動到數組的前面,而0則自然被留在了后面。
時間復雜度:O(n2)
- 新代碼的時間復雜度是O(n2),這是因為它使用了兩層嵌套循環來遍歷數組。對于每一個元素,它都會與其后面的元素進行比較并可能交換,這導致了較高的運算次數,特別是當數組較大時。?