雙指針法高效解決「移除元素」問題

雙指針法高效解決「移除元素」問題

  • 雙指針法高效解決「移除元素」問題
    • 一、問題描述
    • 二、解法解析:雙指針法
      • 1. 核心思想
      • 2. 算法步驟
      • 3. 執行過程示例
    • 三、關鍵點分析
    • 四、復雜度分析
    • 五、與其他解法的比較
      • 1. 快慢指針法
      • 2. 本解法的優勢
    • 六、實際應用場景
    • 七、總結


雙指針法高效解決「移除元素」問題

一、問題描述

給定一個整數數組 nums 和一個整數 val,我們需要原地移除所有數值等于 val 的元素,并返回移除后數組的新長度。要求:

  • 必須原地修改輸入數組
  • 不需要考慮數組中超出新長度后面的元素
  • 空間復雜度應為 O(1)

二、解法解析:雙指針法

1. 核心思想

采用首尾雙指針策略:

  • left 指針從數組頭部開始,負責構建新數組
  • right 指針從數組尾部開始,提供替換元素

2. 算法步驟

public int removeElement(int[] nums, int val) {int left = 0, right = nums.length - 1;  // 初始化雙指針while (left <= right) {  // 循環條件if (nums[left] == val) {  // 發現目標值nums[left] = nums[right];  // 用末尾元素覆蓋right--;  // 右指針左移} else {left++;  // 非目標值,左指針右移}}return left;  // left即為新長度
}

3. 執行過程示例

nums = [3,2,2,3], val = 3 為例:

  1. 初始狀態:[3,2,2,3], left=0, right=3
  2. nums[0]==3 → 替換為nums[3] → [3,2,2,3], right=2
  3. nums[0]==3 → 替換為nums[2] → [2,2,2,3], right=1
  4. nums[0]==2 → left=1
  5. nums[1]==2 → left=2
  6. left>right 循環結束
  7. 返回 left=2,新數組為 [2,2,...]

三、關鍵點分析

  1. 邊界條件while (left <= right) 確保處理所有元素
  2. 元素交換:發現目標值時直接覆蓋而非交換,減少操作
  3. 指針移動
    • 只有確認當前元素不是目標值時才移動左指針
    • 每次覆蓋操作后右指針必定左移

四、復雜度分析

指標說明
時間復雜度O(n)最多遍歷數組一次
空間復雜度O(1)只使用了常數級別的額外空間

五、與其他解法的比較

1. 快慢指針法

int slow = 0;
for (int fast = 0; fast < nums.length; fast++) {if (nums[fast] != val) {nums[slow++] = nums[fast];}
}
return slow;
  • 更適合目標值較少的情況
  • 元素移動次數可能更多

2. 本解法的優勢

  • 在目標值較多時效率更高
  • 每個目標值只需一次賦值操作
  • 保留了數組末端的原有元素

六、實際應用場景

這種雙指針技巧適用于:

  1. 需要原地修改數組的問題
  2. 需要保持部分元素順序的問題
  3. 資源受限環境下的數組操作

七、總結

這種首尾雙指針解法:

  1. 是處理數組原地修改的高效方法
  2. 通過巧妙地指針移動減少不必要的操作
  3. 體現了算法設計中空間換時間的思想
  4. 需要熟練掌握指針邊界條件的控制

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

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

相關文章

知識圖譜構架

目錄 知識圖譜構架 一、StanfordNLP 和 spaCy 工具介紹 &#xff08;一&#xff09;StanfordNLP 主要功能 使用示例 &#xff08;二&#xff09;spaCy 主要功能 使用示例 二、CRF 和 BERT 的基本原理和入門 &#xff08;一&#xff09;CRF&#xff08;條件隨機場&…

激光三角測量標定與應用

文章目錄 1&#xff0c;介紹。2&#xff0c;技術原理3&#xff0c;類型。3.1&#xff0c;直射式3.2&#xff0c;斜射式3.3&#xff0c;兩種三角位移傳感器特性的比較 4&#xff0c;什么是光片&#xff1f;5&#xff0c;主要的算子。1&#xff0c;create_sheet_of_light_model2&…

高可用消息隊列實戰:AWS SQS 在分布式系統中的核心解決方案

引言&#xff1a;消息隊列的“不可替代性” 在微服務架構和分布式系統盛行的今天&#xff0c;消息隊列&#xff08;Message Queue&#xff09; 已成為解決系統解耦、流量削峰、異步處理等難題的核心組件。然而&#xff0c;傳統的自建消息隊列&#xff08;如RabbitMQ、Kafka&am…

人工智能核心知識:AI Agent 的四種關鍵設計模式

人工智能核心知識&#xff1a;AI Agent 的四種關鍵設計模式 一、引言 在人工智能領域&#xff0c;AI Agent&#xff08;人工智能代理&#xff09;是實現智能行為和決策的核心實體。它能夠感知環境、做出決策并采取行動以完成特定任務。為了設計高效、靈活且適應性強的 AI Age…

平替BioLegend品牌-Elabscience PE Anti-Mouse Foxp3抗體:流式細胞術中的高效工具,助力免疫細胞分析!”

概述 調節性T細胞&#xff08;Treg&#xff09;在維持免疫耐受和抑制過度免疫反應中發揮關鍵作用&#xff0c;其標志性轉錄因子Foxp3&#xff08;Forkhead box P3&#xff09;是Treg功能研究的重要靶點。Elabscience 推出的抗小鼠Foxp3抗體&#xff08;3G3-E&#xff09;&…

編程日志5.13

鄰接表的基礎代碼 #include<iostream> using namespace std; //鄰接表的類聲明 class Graph {private: //結構體EdgeNode表示圖中的邊結點,包含頂點vertex、權重weight和指向下一個邊結點的指針next struct EdgeNode { int vertex; int weight; …

PowerBI 矩陣實現動態行內容(如前后銷售數據)統計數據,以及過濾同時為0的數據

我們有一張活動表 和 一張銷售表 我們想實現如下的效果&#xff0c;當選擇某個活動時&#xff0c;顯示活動前后3天的銷售對比圖&#xff0c;如下&#xff1a; 實現方法&#xff1a; 1.新建一個表&#xff0c;用于顯示列&#xff1a; 2.新建一個度量值&#xff0c;用SELECTEDVA…

Prompt Tuning:高效微調大模型的新利器

Prompt Tuning(提示調優)是什么 Prompt Tuning(提示調優) 是大模型參數高效微調(Parameter-Efficient Fine-Tuning, PEFT)的重要技術之一,其核心思想是通過優化 連續的提示向量(而非整個模型參數)來適配特定任務。以下是關于 Prompt Tuning 的詳細解析: 一、核心概念…

杰發科技AC7840——如何把結構體數據寫到Dflash中

1. 結構體數據被存放在Pflash中 正常情況下&#xff0c;可以看到全局變量的結構體數據被存放在Pflash中 數字部分存在RAM中 2. 最小編程單位 8字節編程&#xff0c;因此如果結構體存放在Dfalsh中&#xff0c;進行寫操作&#xff0c;需要寫8字節的倍數 第一種辦法&#xff1a;…

CSS 選擇器入門

一、CSS 選擇器基礎&#xff1a;快速掌握核心概念 什么是選擇器&#xff1f; CSS 選擇器就像 “網頁元素的遙控器”&#xff0c;用于定位 HTML 中的特定元素并應用樣式。 /* 結構&#xff1a;選擇器 { 屬性: 值; } */ p { color: red; } /* 選擇所有<p>元素&#xff0c;…

Anaconda3安裝教程(附加安裝包)Anaconda詳細安裝教程Anaconda3 最新版安裝教程

多環境隔離 可同時維護生產環境、開發環境、測試環境&#xff0c;例如&#xff1a; conda create -n ml python3.10 # 創建機器學習環境 conda activate ml # 激活環境三、Anaconda3 安裝教程 解壓Anaconda3安裝包 找到下載的 Anaconda3 安裝包&#xff08;.ex…

現代計算機圖形學Games101入門筆記(十七)

雙向路徑追蹤 外觀建模 散射介質 人的頭發不能用在動畫的毛發上。 動物的髓質Medulla特別大 雙層圓柱模型應用 BSSRDF是BRDF的延伸。 天鵝絨用BRDF不合理&#xff0c;轉成散射介質。 法線分布 光追很難處理微表面模型 光在微型細節上&#xff0c;光是一個波&#xff0c;會發生衍…

chrome源碼中WeakPtr 跨線程使用詳解:原理、風險與最佳實踐

base::WeakPtr 在 Chromium 中 不能安全地跨線程使用。這是一個很關鍵的點&#xff0c;下面詳細解釋原因及正確用法。 &#x1f50d;原理與使用 ? 先說答案&#xff1a; base::WeakPtr 本質上是**線程綁定&#xff08;thread-affine&#xff09;**的。不能在多個線程之間創建…

hysAnalyser 從MPEG-TS導出ES功能說明

摘要 hysAnalyser 是一款特色的 MPEG-TS 數據分析工具。本文主要介紹了 hysAnalyser 從MPEG-TS 中導出選定的 ES 或 PES 功能(版本v1.0.003)&#xff0c;以便用戶知悉和掌握這些功能&#xff0c;幫助分析和解決各種遇到ES或PES相關的實際問題。hysAnalyser 支持主流的MP1/MP2/…

C++(21):fstream的讀取和寫入

目錄 1 ios::out 2 ios::in和is_open 3 put()方法 4 get()方法 4.1 讀取單個字符 4.2 讀取多個字符 4.3 設置終結符 5 getline() 1 ios::out 打開文件用于寫入數據。如果文件不存在&#xff0c;則新建該文件&#xff1b;如果文件原來就存在&#xff0c;則打開時清除…

系統架構設計(十七):微服務數據一致性和高可用策略

數據一致性問題 問題本質 由于每個微服務擁有獨立數據庫&#xff0c;跨服務操作不能用傳統的數據庫事務&#xff0c;面臨“分布式事務”一致性挑戰。 數據一致性策略 策略核心思想應用場景優缺點強一致性&#xff08;Strong Consistency&#xff09;所有操作實時同步成功&a…

os agent智能體軟件 - 第三彈 - 純語音交互

前兩期期我們發布了產品的初級形態&#xff0c;那時候還只能是“軟件開發者”在本地配置使用&#xff0c;或者運行起來有個大黑框&#xff0c;使用起來美觀度太差。 到今天大概20天&#xff0c;我們的第3版已經出來了&#xff0c;不僅做成了電腦端的exe軟件&#xff08;任何人…

鏈表原理與實現:從單鏈表到LinkedList

1.鏈表的概念及結構 鏈表是一種物理存儲結構上非連續存儲結構&#xff0c;數據元素的邏輯順序是通過鏈表中的引用鏈接次序實現的 。 可以形象的理解&#xff0c;在邏輯上來看&#xff0c;鏈表就像是一節節火車車廂。 鏈表的分類&#xff1a;鏈表的結構有很多種&#xff0c;單向…

替換word中的excel

PostMapping("/make/report/target/performance/first") public AjaxResult makeTargetReportFirst(RequestBody MakeReportDTO makeReportDTO) {Map<String, String> textReplaceMap new HashMap<>();// 替換日期LocalDateTime nowData LocalDateTime…

深入探索百度智能云千帆AppBuilder:從零開始構建AI應用

在數字化轉型的浪潮中&#xff0c;企業對高效、智能的應用開發平臺的需求日益增長。百度智能云千帆AppBuilder&#xff08;以下簡稱AppBuilder&#xff09;憑借其強大的功能和靈活的開發方式&#xff0c;成為企業級大模型應用開發的理想選擇。本文將詳細介紹如何使用AppBuilder…