leetcode刪除排序陣列的重複項

2021-09-22 22:56:18 字數 1735 閱讀 5626

是題目描述

最開始想到的是使用雙重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...