力扣鏈接:?力扣
給你一個(gè)數(shù)組 nums?和一個(gè)值 val,你需要 原地 移除所有數(shù)值等于?val?的元素,并返回移除后數(shù)組的新長(zhǎng)度。
不要使用額外的數(shù)組空間,你必須僅使用 O(1) 額外空間并原地修改輸入數(shù)組。
元素的順序可以改變。你不需要考慮數(shù)組中超出新長(zhǎng)度后面的元素。
示例 1: 給定 nums = [3,2,2,3], val = 3, 函數(shù)應(yīng)該返回新的長(zhǎng)度 2, 并且 nums 中的前兩個(gè)元素均為 2。 你不需要考慮數(shù)組中超出新長(zhǎng)度后面的元素。
示例?2: 給定 nums = [0,1,2,2,3,0,4,2], val = 2, 函數(shù)應(yīng)該返回新的長(zhǎng)度 5, 并且 nums 中的前五個(gè)元素為 0, 1, 3, 0, 4。
你不需要考慮數(shù)組中超出新長(zhǎng)度后面的元素。
思路:考慮兩個(gè)指針同時(shí)看這個(gè)nums數(shù)組,快指針跑的快一些(每一個(gè)循環(huán)都往后走一步),可以先去后面看看元素是什么。而慢指針走的慢一些(只有當(dāng)快指針丟給他符合條件也就是nums[fast]!=val時(shí)才更新),這樣慢指針接收到的數(shù)永遠(yuǎn)是fast篩選過符合條件的數(shù)。當(dāng)fast走完一遍,slow指向的就是最后一個(gè)符合條件的數(shù)的下一個(gè)位置。文章來源:http://www.zghlxwxcb.cn/news/detail-524621.html
# 1.快慢指針同向,相當(dāng)于快指針先跑到后面看看,把后面nums中不是val的值丟給慢指針,慢指針只負(fù)責(zé)接受不等于val的值
def removeElement(nums, val):
slow = 0
fast = 0
while fast<len(nums):# 快指針看完一遍就該退出了,此時(shí)慢指針一定能使所有不為val的值都排在前面
if nums[fast]!=val:# 快指針看完發(fā)現(xiàn)這個(gè)值不是val,就丟給慢指針
nums[slow] = nums[fast]
slow += 1
fast += 1
return slow
nums = [0,1,2,2,3,0,4,2]
val = 2
print(removeElement(nums, val))
如果刪除指定val元素后剩余元素的順序不要求和原來相等,那我們還可以用對(duì)撞指針,類似與快排用到的方法。文章來源地址http://www.zghlxwxcb.cn/news/detail-524621.html
# 2.對(duì)撞指針,有點(diǎn)像快排,從左往右找到一個(gè)為val的值,再從右往左找一個(gè)不為val的值,把找到的兩個(gè)數(shù)交換,這樣所有不為val都會(huì)被換到前面
def removeElement(nums, val):
left = 0
right = len(nums)-1
while left<=right:# left>right時(shí)可以退出了,必定已經(jīng)交換完所有該交換的數(shù)了
while nums[left] != val:
left += 1
while nums[right]==val:
right -= 1
if left<right:
nums[left], nums[right] = nums[right], nums[left]
return left + 1 if nums[left]!=val else left
nums = [0,1,2,2,3,0,4,2]
val = 2
print(removeElement(nums, val))
到了這里,關(guān)于【代碼隨想錄打卡】快慢指針的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!