Python每日一練之刪除有序數(shù)組中的重復(fù)項
1. 問題描述
給你一個有序數(shù)組 nums ,請你 原地 刪除重復(fù)出現(xiàn)的元素,使得出現(xiàn)次數(shù)超過兩次的元素只出現(xiàn)兩次 ,返回刪除后數(shù)組的新長度。
不要使用額外的數(shù)組空間,你必須在 原地 修改輸入數(shù)組 并在使用 O(1) 額外空間的條件下完成。
示例 1:
輸入:nums = [1,1,1,2,2,3] 輸出:5, nums = [1,1,2,2,3] 解釋:函數(shù)應(yīng)返回新長度 length = 5, 并且原數(shù)組的前五個元素被修改為 1, 1, 2, 2, 3。 不需要考慮數(shù)組中超出新長度后面的元素。
示例 2:
輸入:nums = [0,0,1,1,1,1,2,3,3] 輸出:7, nums = [0,0,1,1,2,3,3] 解釋:函數(shù)應(yīng)返回新長度 length = 7, 并且原數(shù)組的前七個元素被修改為 0, 0, 1, 1, 2, 3, 3。不需要考慮數(shù)組中超出新長度后面的元素。
2. 問題分析
使用滑動窗口+刪除元素的方法。
對于nums = [1,1,1,2,2,3]
(1)窗口[1,1,1], 長度=3>2,刪除第3個1---->[1,1,2,2,3]
(2)窗口[2,2],長度=2<=2,保留
(3)窗口[3],長度=1<=2,保留
結(jié)果:[1,1,2,2,3], 長度=5、
3. 算法思路
思路:
(1)定義窗口: beginIndex和endIndex標(biāo)記相同元素的起始和結(jié)束位置
(2)遍歷數(shù)組:用endIndex向右擴(kuò)展,找到相同元素的連續(xù)區(qū)間
(3)處理重復(fù):當(dāng)遇到不同元素時,檢查當(dāng)前連續(xù)區(qū)間的長度
如果長度>2,刪除多余的元素
如果長度<=2,直接移動指針
4. 代碼實(shí)現(xiàn)
from typing import List
class Solution:
def remove(self, nums: List[int]) -> int:
if len(nums) <= 2:
return len(nums)
slow = 2 # 從第三個位置開始檢查
for fast in range(2, len(nums)):
# 如果當(dāng)前元素不等于slow指針前兩個位置的元素
# 說明可以保留當(dāng)前元素
if nums[fast] != nums[slow - 2]:
nums[slow] = nums[fast]
slow += 1
return slow
def removeDuplicates(self, nums: List[int]) -> int:
if not nums:
return 0
beginIndex = 0
endIndex = 0
value = nums[beginIndex]
while endIndex < len(nums):
if nums[endIndex] == value:
endIndex += 1
else:
if endIndex - beginIndex > 2:
for i in range(endIndex-1, beginIndex+1, -1):
nums.pop(i)
beginIndex = beginIndex + 2
endIndex = beginIndex
value = nums[beginIndex]
else:
beginIndex = endIndex
value = nums[beginIndex]
if endIndex - beginIndex > 2:
for i in range(endIndex-1, beginIndex+1, -1):
nums.pop(i)
return len(nums)
if __name__ == '__main__':
#print(Solution().removeDuplicates([1,1,1]))
#print(Solution().removeDuplicates([1,1,1,2,2,3]))
print(Solution().removeDuplicates([0,0,1,1,1,1,2,3,3]))這個算法的代碼思路直觀,容易理解,使用滑動窗口的概念,但是時間復(fù)雜度高,pop(i)操作是O(n),最壞情況時間復(fù)雜度是O(n^2),并且需要處理多個邊界情況,頻繁刪除操作導(dǎo)致數(shù)組元素頻繁移動??梢試L試使用雙指針法,時間復(fù)雜度降為O(n).
總結(jié)
到此這篇關(guān)于Python每日一練之刪除有序數(shù)組中的重復(fù)項的文章就介紹到這了,更多相關(guān)Python刪除有序數(shù)組中的重復(fù)項內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
TensorFlow人工智能學(xué)習(xí)Keras高層接口應(yīng)用示例
這篇文章主要為大家介紹了TensorFlow人工智能學(xué)習(xí)中Keras高層接口的應(yīng)用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-11-11
python GUI庫圖形界面開發(fā)之PyQt5瀏覽器控件QWebEngineView詳細(xì)使用方法
這篇文章主要介紹了python GUI庫圖形界面開發(fā)之PyQt5瀏覽器控件QWebEngineView詳細(xì)使用方法,需要的朋友可以參考下2020-02-02
簡介Python設(shè)計模式中的代理模式與模板方法模式編程
這篇文章主要介紹了Python設(shè)計模式中的代理模式與模板方法模式編程,文中舉了兩個簡單的代碼片段來說明,需要的朋友可以參考下2016-02-02
Django文件存儲 默認(rèn)存儲系統(tǒng)解析
這篇文章主要介紹了Django文件存儲 默認(rèn)存儲系統(tǒng)解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-08-08
使用selenium模擬登錄解決滑塊驗證問題的實(shí)現(xiàn)
這篇文章主要介紹了使用selenium模擬登錄解決滑塊驗證問題的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05
python實(shí)現(xiàn)在控制臺輸入密碼不顯示的方法
這篇文章主要介紹了python實(shí)現(xiàn)在控制臺輸入密碼不顯示的方法,實(shí)例分析了Python基于console模塊實(shí)現(xiàn)密碼顯示星號輸入的技巧,需要的朋友可以參考下2015-07-07

