是題目描述
最開始想到的是使用雙重for迴圈
def removeduplicates(nums):
""":type nums: list[int]
:rtype: int
"""for i in range(len(nums) - 1):
first = nums[i]
for j in range(i + 1, len(nums)):
if nums[j] == first:
del nums[j]
j = j - 1
return nums
這段**是錯誤的,因為range()函式裡的值一旦變換,i或者j就會重新從range()函式裡的初始值開始,總之各種混亂,出錯。總結:當判斷條件不斷更新時,不建議使用range()或者for迴圈,建議使用while 迴圈。
修改**:
def removeduplicates(nums):
""":type nums: list[int]
:rtype: int
"""i = 0
while (i < len(nums) - 1):
first = nums[i]
j = i + 1
while j < len(nums):
if nums[j] == first:
del nums[j]
j = j - 1
j = j + 1
i = i + 1
count = len(nums)
return count
removeduplicates([0, 0, 1, 1, 1, 2, 2, 3, 3, 4])
**能夠執行成功,但是在力扣提交後,**執行超出時間範圍,看來是演算法的時間複雜度太高,而且這段**可以對未排序內容進行刪除重複項(不看題目的後果),需繼續改進。究其原因,是因為在正向遍歷過程中,每次刪除陣列元素會引發大量的資料遷移操作,所以可以逆向排序,逆遍歷可以防止刪除某個元素後影響下一步索引的定位,改進後的**
def removeduplicates_2(nums):
for i in range(len(nums) - 1, 0, -1):
if nums[i] == nums[i - 1]:
del nums[i]
print(nums)
return len(nums)
removeduplicates_2([0, 0, 1, 1, 1, 2, 2, 3, 3, 4])
時間效率空間效率大大提高,而標準解法是使用雙指標
ef removeduplicates_3(nums):
i = 0
for j in range(1, len(nums)):
if nums[j] != nums[i]:
nums[i + 1] = nums[j]
i += 1
print(nums[0 : i + 1])
return i + 1
removeduplicates_3([0, 0, 1, 1, 1, 2, 2, 3, 3, 4])
在這種解法中,nums列表並沒有刪除重複元素,nums[0: i + 1]才是沒有重複元素的列表。 LeetCode 陣列 刪除排序陣列中的重複項
給定乙個排序陣列,你需要在 原地 刪除重複出現的元素,使得每個元素只出現一次,返回移除後陣列的新長度。不要使用額外的陣列空間,你必須在 原地 修改輸入陣列 並在使用 o 1 額外空間的條件下完成。示例 給定 nums 0,0,1,1,1,2,2,3,3,4 函式應該返回新的長度 5,並且原陣列 nu...
Leetcode題解026 刪除排序陣列中的重複項
給定乙個排序陣列,你需要在 原地 刪除重複出現的元素,使得每個元素只出現一次,返回移除後陣列的新長度。不要使用額外的陣列空間,你必須在 原地 修改輸入陣列 並在使用 o 1 額外空間的條件下完成 給定陣列 nums 1,1,2 函式應該返回新的長度 2,並且原陣列 nums 的前兩個元素被修改為 1...
leetcode 刪除排序陣列重複元素
題目 給定乙個排序陣列,你需要在原地刪除重複出現的元素,使得每個元素只出現一次,返回移除後陣列的新長度。不要使用額外的陣列空間,你必須在原地 修改輸入陣列並在使用 o 1 額外空間的條件下完成。示例 給定 nums 0,0,1,1,1,2,2,3,3,4 函式應該返回新的長度 5,並且原陣列 num...