日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

lrange是取出所有值并移除么_图解双指针 | LeetCode 27. 移除元素

發(fā)布時(shí)間:2025/3/15 编程问答 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 lrange是取出所有值并移除么_图解双指针 | LeetCode 27. 移除元素 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目描述

原題鏈接:LeetCode 27. 移除元素

給定一個(gè)數(shù)組 nums 和一個(gè)值 val,你需要原地移除所有數(shù)值等于 val 的元素,返回移除后數(shù)組的新長度。

不要使用額外的數(shù)組空間,你必須在原地修改輸入數(shù)組并在使用 O(1) 額外空間的條件下完成。

元素的順序可以改變。你不需要考慮數(shù)組中超出新長度后面的元素。

示例 1:

給定 nums = [3,2,2,3], val = 3,函數(shù)應(yīng)該返回新的長度 2, 并且 nums 的前兩個(gè)元素均為 2。你不需要考慮數(shù)組中超出新長度后面的元素。

示例 2:

給定 nums = [0,1,2,2,3,0,4,2], val = 2,函數(shù)應(yīng)該返回新的長度 5, 并且 nums 中的前五個(gè)元素為 0, 1, 3, 0, 4。注意這五個(gè)元素可為任意順序。你不需要考慮數(shù)組中超出新長度后面的元素。

說明:

為什么返回?cái)?shù)值是整數(shù),但輸出的答案是數(shù)組呢?

請(qǐng)注意,輸入數(shù)組是以“引用”方式傳遞的,這意味著在函數(shù)里修改輸入數(shù)組對(duì)于調(diào)用者是可見的。

你可以想象內(nèi)部操作如下:

// nums 是以“引用”方式傳遞的。也就是說,不對(duì)實(shí)參作任何拷貝 int len = removeElement(nums, val);// 在函數(shù)里修改輸入數(shù)組對(duì)于調(diào)用者是可見的。 // 根據(jù)你的函數(shù)返回的長度, 它會(huì)打印出數(shù)組中該長度范圍內(nèi)的所有元素。 for (int i = 0; i < len; i++) {print(nums[i]); }

題意解讀

劃一下題目的重點(diǎn):

  • 原地移除
  • 不要使用額外的數(shù)組空間
  • 不需要考慮數(shù)組中超出新長度后面的元素

題目要求我們?cè)貏h除所有等于 val 的元素,不能使用額外空間,且不用考慮刪除后超出新數(shù)組長度后面的元素。

也就是說,如果原數(shù)組 nums 長度為 x,要?jiǎng)h除的 val 元素個(gè)數(shù)為 y,那么我們只要把這 n 個(gè)要?jiǎng)h除的元素所在位置用其他有效元素覆蓋掉,然后返回最終的數(shù)組長度 x - y。

題目并非讓我們真的刪除數(shù)組的元素,而是要改寫相關(guān)元素的值。

思路闡述

那么要如何進(jìn)行元素的改寫呢?

既然要讓 val 元素都堆在數(shù)組尾部,那么我們就派出一個(gè)開拓者探路,只要遇到非 val 元素,就把它覆蓋到前面來。

因此,我們可以定義兩個(gè)指針:

  • 快指針 j:用于尋找非 val 元素
  • 慢指針 i:當(dāng) j 找到非 val 元素時(shí),就被非 val 元素覆蓋

圖解思路

以題中的 nums = [3,2,2,3], val = 3 為例。

開始時(shí) i 和 j 都指向下標(biāo) 0 位置:

此時(shí) j 指向的元素為 val,所以把 j 右移動(dòng) 1 位:

此時(shí),開拓者 j 找到了一個(gè)非 val 元素,那么就賦值給 i 吧:

賦值以后,我們得到了一個(gè)新的序列 [2, 2, 2, 3],我們可以得知:

  • i 指向的元素一定不是 val,因?yàn)樗菑?j 指向的元素賦值得來的,j 指向非 val 元素才會(huì)進(jìn)行賦值
  • j 指向的元素一定不是非 val???

這樣一來,i 和 j 都完成了本輪使命,繼續(xù)前進(jìn)!

因此每次交換以后,我們都同步增長雙指針,令 i = i + 1,j = j + 1:

此時(shí) j 又指向了一個(gè)非 val 元素,繼續(xù)賦值:

因?yàn)楸敬?i 與 j 指向元素相同,所以賦值后序列沒有改變。賦值操作后,我們繼續(xù)同步增長雙指針:

此時(shí) j 指向了一個(gè) val 元素,無法進(jìn)行賦值操作,繼續(xù)增長 j,令 j = j + 1:

此時(shí)我們發(fā)現(xiàn) j 超出數(shù)組范圍了,循環(huán)結(jié)束。[2, 2, 2, 3] 即為我們最終所求結(jié)果,而紅色部分即為新數(shù)組長度,長度為 len(nums) - (j - i)。

總結(jié)一下

設(shè)置雙指針 i 和 j,其中,j 用于尋找非 val 元素,來覆蓋 i 所指向的元素。

  • 初始時(shí):設(shè) i = 0, j = 0
  • 遍歷數(shù)組:
    • 若 `nums[j] != val`:
      • 把 `j` 的值賦給 `i`:`nums[i] = nums[j]`
      • 同步增長雙指針:`i = i + 1, j = j + 1`
    • 若 `nums[j] == val`:
      • `j` 變?yōu)榭熘羔?#xff1a;`j = j + 1`,尋找下一個(gè)非 `val` 元素

具體實(shí)現(xiàn)

Python

class Solution:def removeElement(self, nums, val):""":type nums: List[int]:type val: int:rtype: int"""length = len(nums)i = 0j = 0while j < length:if nums[j] != val:nums[i] = nums[j]i = i + 1j = j + 1else:j = j + 1res = length - (j - i)return res

Golang

func removeElement(nums []int, val int) int {length := len(nums)if length == 0 {return 0}i := 0j := 0for j < length {if nums[j] == val {// 去找一個(gè)不是 val 的值j++} else {// 賦值nums[i] = nums[j]i++ j++}}return length - (j - i) }

復(fù)雜度

  • 時(shí)間復(fù)雜度:O(n)
  • 空間復(fù)雜度:O(1),沒有使用到額外空間。

  • 我的題解項(xiàng)目: https://github.com/JalanJiang/leetcode-notebook
  • 如果你對(duì)做題和分享題解感興趣,歡迎加入 LeetCode 刷題小分隊(duì):https://github.com/leetcode-notebook/leetcode-notebook.github.io/blob/master/README.md
  • 如果你覺得文章寫得不錯(cuò),歡迎關(guān)注公眾號(hào)「編程拯救世界」,公眾號(hào)專注于編程基礎(chǔ)與服務(wù)端研發(fā),定期分享算法與數(shù)據(jù)結(jié)構(gòu)干貨~

總結(jié)

以上是生活随笔為你收集整理的lrange是取出所有值并移除么_图解双指针 | LeetCode 27. 移除元素的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。