刪除元素(不是刪除而是覆蓋)快慢指針 慢指針是覆蓋位置,快指針找元素

? 📝 題目:移除元素

? 題目描述: 給定數組和值val,原地移除所有等于val的元素,返回新長度。

? 例子: nums = [3,2,2,3], val = 3 → nums = [2,2,_,_], return 2

? 🔥 暴力法思路:

? 暴力法想法:

? "我要刪除所有等于val的元素,
那我就從頭開始找,
遇到一個val就刪除它,
然后所有后面的元素都向前移動一位。"

? 暴力法代碼:

? def removeElement_brute(nums, val):i = 0while i < len(nums):if nums[i] == val:# 刪除當前元素:所有后面元素前移for j in range(i, len(nums) - 1):nums[j] = nums[j + 1]nums.pop() ?# 刪除最后一個元素# 注意:i不自增,因為刪除后要檢查新的nums[i]else:i += 1return len(nums)

? 暴力法執行過程:

? 初始: [3, 2, 2, 3], val = 3

? i=0: nums[0]=3==val,刪除
刪除后: [2, 2, 3, _],長度變成3

? i=0: nums[0]=2!=val,i++

? i=1: nums[1]=2!=val,i++

? i=2: nums[2]=3==val,刪除
刪除后: [2, 2, _, _],長度變成2

? 結束: 返回2

? 暴力法問題: 每次刪除都要移動大量元素,效率低!

● 🎯 雙指針法思路(快慢指針):

? 雙指針法想法:

? "我不刪除元素,而是重新整理數組!
用兩個指針:
- slow指針:指向下一個要放入好元素的位置
- fast指針:遍歷所有元素
如果fast指向的元素不是val,就放到slow位置"

? 核心理念: "覆蓋代替刪除"

? 不要真的刪除,而是用好的元素覆蓋壞的位置!

? 雙指針法代碼:

? def removeElement_two_pointers(nums, val):slow = 0 ?# 慢指針:下一個好元素要放的位置for fast in range(len(nums)): ?# 快指針:遍歷所有元素if nums[fast] != val: ? ? ?# 如果是好元素nums[slow] = nums[fast] ?# 放到slow位置slow += 1 ? ? ? ? ? ? ? ?# slow后移return slow ?# slow就是新數組的長度

? 雙指針法執行過程:

? 初始: [3, 2, 2, 3], val = 3
slow=0, fast=0

? fast=0: nums[0]=3==val,跳過
slow=0 不變

? fast=1: nums[1]=2!=val,是好元素
nums[0] = nums[1] = 2
數組變成: [2, 2, 2, 3]
slow = 1

? fast=2: nums[2]=2!=val,是好元素
nums[1] = nums[2] = 2
數組變成: [2, 2, 2, 3]
slow = 2

? fast=3: nums[3]=3==val,跳過
slow=2 不變

? 結果: 數組前2位是[2,2],返回長度2

? 🔍 雙指針法的巧妙之處:

? 1. 兩個指針的分工:

? slow指針:維護"已整理好的部分"
fast指針:探索"還沒處理的部分"

? 2. 狀態變化:

? 初始: [需要處理的部分 ? ? ? ? ?]
slow=0

? 進行中: [已整理好] [需要處理的部分]
↑slow ? ? ?↑fast

? 最終: [已整理好] [垃圾區域]
↑slow

● 🧠 兩種方法的思維對比:

? | 維度 ? ?| 暴力法思維 ? | 雙指針法思維 ?|
|-------|---------|---------|
| 操作方式 ?| 真實刪除元素 ?| 覆蓋重排元素 ?|
| 思考角度 ?| "刪掉壞的" ?| "保留好的" ?|
| 處理策略 ?| 遇到壞元素就刪 | 遇到好元素就搬 |
| 時間復雜度 | O(n2) ? | O(n) ? ?|
| 空間復雜度 | O(1) ? ?| O(1) ? ?|

? 💭 思維轉換的關鍵:

? 暴力法思維:

? "我要刪除所有val=3的元素"
↓ 直接但低效
真的去刪除和移動

? 雙指針法思維:

? "我要構建一個新數組,只包含不等于val的元素"
↓ 間接但高效
原地重新排列

? 🎯 雙指針法的核心洞察:

? 關鍵洞察1: 不需要真的刪除,只需要重新排列
關鍵洞察2: 好元素的相對順序不變
關鍵洞察3: 只關心前面的好元素,后面的垃圾不管

? 為什么雙指針法更快?

? 暴力法:每次刪除都要移動O(n)個元素 → 總共O(n2)
雙指針法:每個元素只被訪問一次,只做O(1)操作 → 總共O(n)

? ★ Insight ─────────────────────────────────────
雙指針法的精髓是"重新定義問題":從"刪除不要的元素"重新定義為"收集想要的元素"。這種思維轉換讓我們從刪除操作(需要移動大量元素)變成了覆蓋操作(只需要一次賦
值),從而大幅提升效率。
─────────────────────────────────────────────────

● 總結:暴力法="刪掉壞的",雙指針法="收集好的"。關鍵思維轉換:從刪除操作變成覆蓋操作,效率從O(n2)提升到O(n)!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/96020.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/96020.shtml
英文地址,請注明出處:http://en.pswp.cn/web/96020.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

10 【C++】泛型編程

文章目錄前言泛型編程&#xff08;模板&#xff09;1. 函數模板1.1 函數模板格式1.2 函數模板的實例化隱式實例化顯式指定模板參數實例化1.3 函數模板實例化的原理1.4 模板參數的匹配原則2. 類模板2.1 類模板的格式2.2 類模板的實例化2.3 類模板實例化的原理2.4 類模板的匹配原…

【基于YOLO和Web的交通工具識別系統】

系統功能 視頻檢測&#xff1a;對輸入的視頻流進行實時或離線分析&#xff0c;自動識別視頻中出現的交通工具&#xff08;如飛機、自行車等&#xff09;及行人&#xff0c;輸出包含目標類別、位置等信息的檢測結果。攝像檢測&#xff1a;通過連接攝像頭設備&#xff0c;對實時…

Python進程,線程

目錄 一、多任務 1.1定義 1.2具體體現 1.3并發和并行 1.3.1并發操作 1.3.2并行操作 1.3.3對比 二、進程 2.1概念 2.2特點 2.3進程狀態 2.4多進程 2.5多進程實現 2.6進程鎖 三、線程 3.1概念 3.2特點 3.3適用場景 3.4多線程實現 四、對比 4.1關系對? 4.2區…

【Element Plus 表單組件樣式統一 CSS 文字特效實現指南】

Element Plus 表單組件樣式統一 & CSS 文字特效實現指南 前言 在使用 Element Plus 組件庫開發表單頁面時&#xff0c;我們遇到了一個看似簡單卻很有趣的問題&#xff1a;el-input、el-select 和 el-textarea 在禁用狀態下的文字顏色不一致。通過深入研究&#xff0c;我們…

網絡通信與協議棧 -- OSI,TCP/IP模型,協議族,UDP編程

網絡通信的核心是實現不同主機上進程間的數據交換&#xff0c;其技術體系圍繞 “協議分層模型” 展開&#xff0c;向下依賴硬件介質傳輸電 / 光信號&#xff0c;向上支撐各類網絡應用&#xff08;如網頁瀏覽、文件傳輸&#xff09;。本文結合 OSI 理論框架與 TCP/IP 工業標準&a…

HarmonyOS 新一代聲明式 UI 彈窗機制:從 AlertDialog 到 CustomDialogController 的深度解析與實踐

好的&#xff0c;請看這篇關于 HarmonyOS 新一代聲明式 UI 彈窗機制的技術文章。 HarmonyOS 新一代聲明式 UI 彈窗機制&#xff1a;從 AlertDialog 到 CustomDialogController 的深度解析與實踐 引言 在 HarmonyOS 應用開發中&#xff0c;彈窗&#xff08;Dialog&#xff09;是…

混合推理模型(快思考、慢思考模型)

目錄基礎transformer架構、transformers庫預訓練模型的微調&#xff08;Fine-tuning&#xff09;預訓練微調的大模型應用模式base 模型、instruct 模型區別Hugging Face 上如何查看base模型、instruct模型混合推理模型大模型里的快思考 vs 慢思考qwen3模型含特殊 ChatML / 模型…

prometheus+grafana搭建

部署 prometheus 安裝 # 1,下載 wget https://github.com/prometheus/prometheus/releases/download/v2.45.1/prometheus-3.5.0.linux-amd64.tar.gz# 2,部署 tar -zxvf prometheus-3.5.0.linux-amd64.tar.gz -C /opt/ cd /opt/ mv ./prometheus-3.5.0.linux-amd64 …

MR30分布式I/O在面機裝備中的應用

隨著食品加工行業向自動化、智能化轉型&#xff0c;面機裝備對控制系統的響應速度、布線靈活性及穩定性提出了更高要求。本案例以某大型食品機械制造企業的全自動面條生產線升級項目為背景&#xff0c;引入 MR30 分布式 IO 模塊替代傳統集中式 IO 方案。通過將 MR30 分布式 IO …

Matlab使用小技巧合集(系列四):Table類型高效用法與數據處理實戰

Matlab使用小技巧合集(系列四):Table類型高效用法與數據處理實戰 在科研數據處理和論文寫作過程中,結構化數據的管理極為重要。Matlab的table類型為研究生和科研人員提供了靈活、高效的數據存儲與處理方式,尤其適合實驗結果整理、分組統計、數據預處理等場景。本文將系統介…

STM32的時鐘系統與時鐘樹的配置

STM32的時鐘系統是其微控制器&#xff08;MCU&#xff09;的核心組成部分&#xff0c;負責為CPU、外設和存儲器等模塊提供精確的時序信號。其設計靈活且復雜&#xff0c;通過多級時鐘樹&#xff08;Clock Tree&#xff09;實現時鐘源的選擇、分頻和分配。以下是詳細介紹&#x…

NV 工具metrics分析(ncu, nsys/torch profiler)

以下分析都以A100硬件架構為例; Theoretical Max Active Warps per SM: 64 Register number: 512 (規定每個thread不能超過256) Theoretical Active Warps per SM [warp]&#xff1a;512//registers_per_thread*4, which defines theoretical active warp occupancy Waves P…

[CISCN2019 總決賽 Day2 Web1]Easyweb

登錄界面可以看到隨機切換的圖片。從頁面源碼中可以看到<div class"avtar"><img src"image.php?id3" width"200" height"200"/></div>&#xff0c;圖片文件的請求地址&#xff0c;并且有傳參id。web應用中像這種動…

第 3 講:KAFKA生產者(Producer)詳解

這是一篇既照顧入門也能給高級工程師提供落地經驗的實戰筆記。0. TL;DR&#xff08;先上結論&#xff09; 想穩&#xff1a;acksall 合理 retries&#xff1b;需要“分區內不重不丟”→ 再加 enable.idempotencetrue 且 max.in.flight<5。想快&#xff1a;適度增大 batch.s…

微信小程序截屏與錄屏功能詳解

微信小程序提供了豐富的API支持截屏和錄屏功能&#xff0c;適用于多種場景&#xff0c;如教育類應用的課程錄制、游戲類應用的精彩瞬間分享、電商類應用的商品展示等。以下將詳細介紹實現方法和應用案例。 截屏功能實現 截屏功能通過調用wx.canvasToTempFilePath或wx.captureSc…

React 中的 HOC 和 Hooks

寫在前面 在函數式組件主導的 React 項目中&#xff0c;高階組件&#xff08;HOC&#xff09;并非首選推薦&#xff0c;更建議優先使用 Hooks來實現復用邏輯。核心原因是 HOC 存在固有的設計缺陷&#xff0c;而 Hooks 能更優雅、簡潔地解決相同問題&#xff0c;同時避免 HOC 的…

【 蒼穹外賣 | Day2】

1. 相關視頻 Day2的全部視頻集數 2. 學習記錄 2.1 對象屬性拷貝 當DTO與實體類或者VO對象之間的一個裝換的時候&#xff0c;如果通過new創建對象&#xff0c;然后調用set方法進行屬性賦值&#xff0c;不夠方便&#xff0c;代碼不夠簡潔。當屬性過多時候&#xff0c;代碼就會…

焊接自動化測試平臺圖像處理分析-模型訓練推理

1、使用技術棧&#xff1a;jdk17/springboot/python/opencv/yolov8 2、JAVA環境搭建 JDK17下載安裝&#xff1a;wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz 解壓軟件 tar -xf jdk-17.0.16_linux-x64_bin.tar.gz 配置全局變量 vim /etc/p…

【python實用小腳本-205】[HR揭秘]手工黨逐行查Bug的終結者|Python版代碼質量“CT機”加速器(建議收藏)

1. 場景故事 “作為HR&#xff0c;我曾用2小時逐行審閱50份Python簡歷項目&#xff0c;直到發現候選人的代碼復雜度超標導致線上事故…” → 轉折點&#xff1a;用麥凱布&#xff08;McCabe&#xff09;圈復雜度檢測腳本&#xff0c;30秒掃描全倉庫&#xff0c;現可100%攔截“高…

LeetCode - 1089. 復寫零

題目 1089. 復寫零 - 力扣&#xff08;LeetCode&#xff09; 思路 這道題我首先想到的是從前往后雙指針&#xff0c;但是這樣做會造成數據的覆蓋&#xff0c;比如說下面的這個情況 所以解決的方法就是從后往前去復寫&#xff0c;但是從后往前的話就要知道最后一個有效元素是…