[優選算法]復寫零

題目鏈接

LeetCode復寫零

題目描述

?

題目解析

一、問題理解

題目要求:給定一個整數數組?arr,在不創建新數組的情況下,將每個出現的?0?復寫一遍(即一個?0?變成兩個?0),同時保持其他元素的相對順序不變。復寫后超出原數組長度的元素需要舍棄。

示例

  • 輸入:[1,0,2,3,0,4,5,0]
  • 輸出:[1,0,0,2,3,0,0,4]

?核心難點:

  1. 必須在原數組上操作(空間復雜度 O(1))
  2. 復寫 0 會改變后續元素的位置,直接從左到右處理會覆蓋未處理的元素

?

二、解題思路:雙指針法

為解決上述問題,我們采用雙指針 + 兩次遍歷」的策略:

第一次遍歷:確定最終需要保留的元素范圍(找到復寫邊界) ?

第二次遍歷:從邊界處從右向左復寫元素(避免覆蓋未處理的元素)?

?

三、分步解析代碼

以下是完整代碼,我們逐部分解析:?

?

四、關鍵步驟詳解

1. 尋找復寫邊界(第一次遍歷)
  • 目的:確定原數組中哪些元素需要參與復寫(避免處理超出最終數組長度的元素)。
  • 雙指針作用
    • cur:遍歷原數組的每個元素(從左到右)。
    • dest:模擬復寫后的數組長度(每遇到?0?加?2,非?0?加?1)。
  • 終止條件:當?dest >= n-1?時停止(復寫指針已超出數組范圍)。

示例過程(輸入?[1,0,2,3]n=4):

  • 初始:cur=0dest=-1
  • cur=0(元素?1):dest +=1 → 0dest < 3cur→1
  • cur=1(元素?0):dest +=2 → 2dest < 3cur→2
  • cur=2(元素?2):dest +=1 → 3dest == 3n-1),停止遍歷。
  • 最終:cur=2dest=3(復寫邊界確定)。
2. 處理邊界情況
  • 特殊場景:當?dest == n?時,說明最后一個元素是?0,且復寫后會超出數組長度(例如輸入?[0,1,2],復寫后?dest?會達到?3,等于?n=3)。
  • 處理方式
    • 最后一個?0?只能復寫?1?次(放在數組末尾?arr[n-1])。
    • 調整指針:cur?回退?1(跳過該?0?的二次處理),dest?回退?2(指向?n-2)。
3. 從右向左復寫(第二次遍歷)
  • 核心邏輯:從?cur?位置向左遍歷,將元素復寫到?dest?位置(避免覆蓋未處理的元素)。
  • 復寫規則
    • 非?0?元素:直接復制到?dest?位置,然后雙指針左移。
    • 0?元素:連續復制兩個?0?到?dest?和?dest-1?位置,然后雙指針左移。

示例過程(續上例?[1,0,2,3]):

  • 初始:cur=2dest=3
  • cur=2(元素?2):arr[3] = 2dest→2cur→1
  • cur=1(元素?0):arr[2] = 0arr[1] = 0dest→0cur→0
  • cur=0(元素?1):arr[0] = 1dest→-1cur→-1
  • 最終結果:[1,0,0,2](符合預期)。

五、復雜度分析

  • 時間復雜度O(n),兩次遍歷數組,總操作次數與數組長度成正比。
  • 空間復雜度O(1),僅使用常數個額外變量,在原數組上操作。

通過這種雙指針策略,我們高效地解決了復寫零的問題,既保證了原地操作,又避免了元素覆蓋的問題。關鍵在于先確定復寫邊界,再從后往前處理,這是解決類似「原地修改數組」問題的常用技巧。

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

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

相關文章

element UI的el-table組件,實現可以拖動

表格 <div class"main_table"><el-table id"elTableid" :data"fieldArr" border style"width: 100%" row-class-name"drag-row"current-row-key highlight-current-row><el-table-column type"index&qu…

Android Emoji 全面解析:從使用到自定義

引言 Emoji已經成為現代數字通信不可或缺的一部分&#xff0c;這些小小的圖標能夠跨越語言障礙&#xff0c;直觀地表達情感和想法。在Android開發中&#xff0c;正確處理和顯示Emoji是提升用戶體驗的重要環節。本文將全面介紹Android平臺上的Emoji支持&#xff0c;包括系統集成…

數據中心入門學習(五):服務器CPU

目錄CPU1 概述1.1 概念1.2 馮諾依曼架構1.3 常見參數&#xff08;評估性能&#xff09;1.4 按指令集分類2 CPU發展2.1 發展史2.2 行業產業鏈2.3 英特爾 Xeon 至強處理器2.4 AMD Zen架構補充1 寄存器、存儲器、內存、緩存、硬盤區別與聯系&#xff1f;2 浮點單元參考本篇記錄和梳…

基于MySQL實現基礎圖數據庫

基于MySQL實現基礎圖數據庫 一、概念 圖數據庫是一種用于存儲和查詢具有復雜關系的數據的數據庫。在這種數據庫中&#xff0c;數據被表示為節點&#xff08;實體&#xff09;和邊&#xff08;關系&#xff09;。圖數據庫的核心優勢在于能夠快速地查詢和處理節點之間的關系。 圖…

RAG面試內容整理-9. 查詢改寫與增強(Query Rewriting, Query Expansion)

查詢改寫和查詢增強是兩種提升檢索效果的技術,目標是在不改變用戶意圖的前提下,使檢索器收到的查詢更全面或明確,從而找到更多相關信息。 查詢改寫通常指將原始查詢轉換成語義等價但更明晰的形式。上一節談到的對話查詢改寫是一個典型場景。在一般情況下,查詢改寫也適用于澄…

golang設置http代理

問題場景&#xff1a; golang通過eino的官方agent示例調用duckduckgo進行聯網搜索時出現網絡問題&#xff0c;電腦此時是掛了工具的瀏覽器整出打開 官方示例&#xff1a;https://www.cloudwego.io/zh/docs/eino/quick_start/agent_llm_with_tools/ 問題原因&#xff1a;go代碼沒…

Elasticsearch 現在默認啟用 BBQ,并通過 ACORN 實現過濾向量搜索

作者&#xff1a;來自 Elastic Gilad Gal 探索 Elasticsearch 的向量搜索如何以更快的速度、更低的成本提供更優結果。 試用向量搜索&#xff1a;使用這套自定進度的 Search AI 實操學習課程&#xff0c;親自體驗向量搜索。你可以開始免費云試用&#xff0c;或立即在本地機器上…

Java 14 新特性解析與代碼示例

Java 14 新特性解析與代碼示例 文章目錄Java 14 新特性解析與代碼示例1. 開關表達式&#xff08;Switch Expressions&#xff09;2. 記錄類型&#xff08;Records&#xff09;3. 文本塊&#xff08;Text Blocks&#xff09;4. instanceof的模式匹配&#xff08;Pattern Matchin…

在虛擬機ubuntu上修改framebuffer桌面不能顯示圖像

目錄 一、測試程序 二、排查原因 三、為什么 Xorg 會導致程序無法工作&#xff1f; 一、測試程序 #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #in…

語言模型的評估指標整理

語言模型&#xff08;Language Models&#xff09;是自然語言處理&#xff08;NLP&#xff09;的核心組件&#xff0c;廣泛應用于機器翻譯、文本生成、對話系統等領域。隨著模型復雜度的提升&#xff0c;如何科學、系統地評估模型性能變得至關重要。評估指標不僅幫助我們理解模…

【開發技術】.Net中配置Serilog日志分級記錄

目錄 一、目的 二、解決方案 2.1 下載serilog包 2.2 Serilog配置 2.2.1 使用多個File sink配置不同的最小日志級別 2.2.2 使用Filter條件分流到不同文件 三、使用建議 四、文章總結 一、目的 在日常開發中&#xff0c;需要根據不同的場景去記錄日志&#xff0c;根據實際…

聊聊如何判斷發現的缺陷屬于前后端

目錄 一、觀察缺陷現象 二、檢查網絡請求&#xff08;核心方法&#xff09; 三、模擬請求驗證后端 四、查看日志 五、數據流分析 六、判斷前后端缺陷方法 判斷發現的缺陷是前后端&#xff0c;可以通過觀察缺陷現象&#xff0c;檢查網絡請求&#xff0c;查看后端日志&…

Python3與MySQL的PyMySQL連接與應用

Python3與MySQL的PyMySQL連接與應用 引言 隨著互聯網技術的飛速發展,數據庫在各個領域的應用日益廣泛。MySQL作為一種開源的關系型數據庫管理系統,因其穩定性和高效性,被廣泛應用于各種場景。Python作為一種高級編程語言,以其簡潔、易讀、易學等特點,受到了廣大開發者的…

智慧城市SaaS平臺|市政公用管理系統

【道路監測運維系統】1.數據可視化a) 實時監控支持對道路監測數據進行分析評估&#xff0c;為道路養護、交通管理、環境保護等提供數據支撐2.道路基礎設施監測支持對道路基礎設施的運行狀態進行實時監測&#xff0c;包括路面狀況3.交通流量監測支持對道路交通流量進行實時監測&…

Maven 配置阿里云鏡像加速

Maven 配置阿里云鏡像加速&#xff1a; 完整配置步驟&#xff08;Windows 系統&#xff09; 1. 找到 Maven 的 settings.xml 文件 全局配置&#xff1a;D:\software\apache-maven-3.9.11\conf\settings.xml用戶配置&#xff1a;C:\Users\Admin\.m2\settings.xml&#xff08;推薦…

去除視頻字幕 3 : 繼續研究 IOPaint,記錄幾個問題

1. 為什么單獨運行&#xff0c;效果很好&#xff0c;批量運行&#xff0c;效果很差。 1. 我運行 iopaint start --modellama --devicecuda --port8080在瀏覽器中單獨選擇圖片&#xff0c;涂選區域&#xff0c;然后處理&#xff0c;此時的效果非常好。2. 但是我進行 iopaint ru…

【深度之眼機器學習筆記】04-01-決策樹簡介、熵,04-02-條件熵及計算舉例,04-03-信息增益、ID3算法

1. 決策樹與熵 1.1 決策樹簡介 下面有一個貸申請樣本表&#xff0c;有許多特征 我們根據特征數據生成一棵樹&#xff0c;比如年齡有青年&#xff0c;中年&#xff0c;老年三個類別&#xff0c;那么就有三個分支&#xff0c;分別對應著三種類別。如果是青年那么就看工作&#xf…

八股文場景題

如何預估接口上線后的 QPS 問題引入 這個問題其實是一個非常實際的問題&#xff0c;因為我們在開發需求后&#xff0c;例如&#xff1a;新增了一個接口 有一個步驟是值得做的&#xff0c;那就是預估這個接口的QPS 因為我們是可以去調配對應服務器的數量和運行配置的 例如我…

【Web安全】深入淺出理解“SQL注入-偽靜態注入”及空格限制繞過技巧

文章目錄什么是偽靜態注入&#xff1f;偽靜態注入中如何繞過空格限制&#xff1f;1. 用注釋符替代空格2. 用不可見字符&#xff08;URL 編碼&#xff09;替代3. 用括號分隔語句4. 用特殊符號替代核心邏輯往期文章【Web安全】一次性搞懂 ReDOS 漏洞原理/檢測/防御 【Web安全】一…

【讀論文】Step-Audio 2 深度解讀:邁向工業級語音交互的「全能型選手」

引言:step-Audio升級 語音交互技術,作為人機交互最自然、最直接的方式之一,正以前所未有的速度發展。從簡單的語音指令到流暢的語音對話,我們對 AI 的期望越來越高。然而,要讓 AI 真正成為我們的“知心伙伴”,僅僅能“聽懂”和“說出”還遠遠不夠。 一個理想的語音 AI,…