LeetCode算 法 實 戰 - - - 雙 指 針 與 移 除 元 素、快 慢 指 針 與 刪 除 有 序 數 組 中 的 重 復 項

LeetCode算 法 實 戰 - - - 雙 指 針 與 移 除 元 素、快 慢 指 針 與 刪 除 有 序 數 組 中 的 重 復 項

  • 第 一 題 - - - 移 除 元 素
    • 方 法 一 - - - 雙 重 循 環
    • 方 法 二 - - - 雙 指 針
    • 方 法 三 - - - 相 向 雙 指 針(面 對 面 移 動)
  • 第 二 題 - - - 刪 除 有 序 數 組 中 的 重 復 項
    • 方 法 一 - - - 快 慢 指 針
    • 方 法 二 - - - 改 進 方 法 一
  • 總 結

💻作 者 簡 介:曾 與 你 一 樣 迷 茫,現 以 經 驗 助 你 入 門 數據 結 構。
💡個 人 主 頁:@笑口常開xpr 的 個 人 主 頁
📚系 列 專 欄:硬 核 數 據 結 構 與 算 法
?代 碼 趣 語:恰 當 的 數 據 視 圖 實 際 上 就 決 定 了 程 序 的 結 構。
💪代 碼 千 行,始 于 堅 持,每 日 敲 碼,進 階 編 程 之 路。
📦gitee 鏈 接:gitee

在這里插入圖片描述

?????????在 數 據 結 構 的 世 界 里,每 一 種 設 計 都 可 能 孕 育 出 驚 人 的 效 率 變 革。你 是 否 深 思 過,一 組 精 心 組 織 的 數 據 究 竟 能 創 造 怎 樣 的 奇 跡?每 一 次 挖 掘 底 層 原 理,都 是 與 計 算 機 智 慧 的 巔 峰 對 話;每 一 次 剖 析 存 儲 模 式,都 在 破 解 數 據 世 界 的 終 極 密 碼。準 備 好 迎 接 這 場 盛 宴 了 嗎?讓 我 們 一 同 探 尋 雙 指 針 的 無 盡 奧 秘,見 證 它 如 何 重 塑 數 字 時 代 的 運 行 法 則!

第 一 題 - - - 移 除 元 素

移 除 元 素

描 述:給 你 一 個 數 組 nums 和 一 個 值 val,你 需 要 原 地 移 除 所 有 數 值 等 于 val 的 元 素。元 素 的 順 序 可 能 發 生 改 變。然 后 返 回 nums 中 與 val 不 同 的 元 素 的 數 量。

?????????假 設 nums 中 不 等 于 val 的 元 素 數 量 為 k,要 通 過 此 題,您 需 要 執 行 以 下 操 作:
1、更 改 nums 數 組,使 nums 的 前 k 個 元 素 包 含 不 等 于 val 的 元 素。nums 的 其 余 元 素 和 nums 的 大 小 并 不 重 要。
2、返 回 k。

示 例 1:
輸 入:nums = [3,2,2,3], val = 3
輸 出:2, nums = [2,2,,]
解 釋:你 的 函 數 函 數 應 該 返 回 k = 2, 并 且 nums 中 的 前 兩 個 元 素 均 為 2。
示 例 2:
輸 入:nums = [0,1,2,2,3,0,4,2], val = 2
輸 出:5, nums = [0,1,4,0,3,,,_]
解 釋:你 的 函 數 應 該 返 回 k = 5,并 且 nums 中 的 前 五 個 元 素 為 0,0,1,3,4。

注 意 這 五 個 元 素 可 以 任 意 順 序 返 回。

提 示:
0 <= nums.length <= 100
0 <= nums[i] <= 50
0 <= val <= 100

方 法 一 - - - 雙 重 循 環

思 路 分 析

?????????題 目 要 求 去 除 一 組 數 中 的 重 復 元 素,并 且 題 目 強 調 nums 的 其 余 元 素 和 nums 的 大 小 并 不 重 要。

?????????可 以 通 過 雙 重 循 環 遍 歷 數 組,當 發 現 目 標 值 時,將 其 后 的 所 有 元 素 依 次 前 移 一 位,從 而 覆 蓋 掉 目 標 值 元 素。(類 似 順 序 表 中 的 頭 插)這 樣 做 的 目 的 是 在 原 數 組 上 直 接 進 行 元 素 移 除 操 作,不 使 用 額 外 的 存 儲 空 間,所 以 空 間 復 雜 度 是 O(1),時 間 復 雜 度 是 O(N^2)。

溫 馨 提 示:讀 者 們 ,先 自 己 寫 代 碼,這 是 提 升 編 程 能 力 的 好 機 會。若 未 達 要 求 ,別 氣 餒 ,參 考 下 文 解 釋 會 有 新 收 獲。

下 面 展 示代 碼 示 例

int removeElement(int* nums, int numsSize, int val) 
{int i = 0;int count = 0;int temp1 = numsSize;while (i < temp1) {if (nums[i] == val) {int temp = i;while (temp < numsSize - 1) {nums[temp] = nums[temp + 1];temp++;}count++;temp1--;}else {i++;}}return numsSize - count;
}

注 意

?????????網 站 上 刷 題 分 為 IO 型 和 接 口 型,IO 型 是 使 用 scanf 得 到 輸 入,結 果 使 用 printf,并 且 要 寫 出 完 整 程 序。接 口 型 是 結 果 通 過 返 回 值 返 回,只 寫 實 現 的 函 數,是 一 部 分 程 序。在 LeetCode 上 刷 題 幾 乎 都 是 接 口 型,調 試 起 來 比 較 麻 煩,牛 客 網 中 有 IO 型 和 接 口 型。

以 數 組 元 素 為 3,2,2,3,1,2,4,2 val 為 2 進 行 動 畫 演 示。

在這里插入圖片描述

在這里插入圖片描述

方 法 二 - - - 雙 指 針

雙 指 針

?????????雙 指 針 是 一 種 常 用 的 算 法 技 巧,利 用 它 們 之 間 的 相 對 移 動 來 高 效 地 解 決 問 題,核 心 思 想 是 將 遍 歷 數 組 和 原 地 修 改 分 離,通 過 一 次 遍 歷 完 成 元 素 篩 選 和 數 組 重 構,通 過 指 針 的 位 置 關 系 快 速 定 位 目 標 元 素 或 區 間。時 間 復 雜 度 優 化 至 O(n)。

同 向 雙 指 針(快 慢 雙 指 針)

?????????同 向 即 同 一 方 向,兩 個 指 針 朝 同 一 方 向 移 動,速 度 可 能 不 同(快 指 針 步 長 更 大,慢 指 針 步 長 較 小)。

思 路 分 析

?????????題 目 要 求 刪 除 數 組 中 等 于 val 的 元 素,因 此 輸 出 數 組 的 長 度 一 定 小 于 等 于 輸 入 數 組 的 長 度,我 們 可 以 把 輸 出 的 數 組 直 接 寫 在 輸 入 數 組 上。使 用 快 指 針 right 指 向 當 前 將 要 處 理 的 元 素,慢 指 針 left 指 向 下 一 個 將 要 賦 值 的 位 置。

?????????如 果 快 指 針 指 向 的 元 素 不 等 于 val,它 一 定 是 輸 出 數 組 的 一 個 元 素,我 們 就 將 快 指 針 指 向 的 元 素 復 制 到 慢 指 針 位 置,然 后 將 快 慢 指 針 同 時 右 移;

?????????如 果 快 指 針 指 向 的 元 素 等 于 val,它 不 能 在 輸 出 數 組 里,此 時 左 指 針 不 動 ,右 指 針 右 移 一 位。

這 里 以 示 例 1 為 例 進 行 演 示:

在這里插入圖片描述

溫 馨 提 示:讀 者 們 ,先 自 己 寫 代 碼,這 是 提 升 編 程 能 力 的 好 機 會。若 未 達 要 求 ,別 氣 餒 ,參 考 下 文 解 釋 會 有 新 收 獲。

下 面 展 示代 碼 示 例

int removeElement(int* nums, int numsSize, int val) 
{int left = 0;for (int right = 0; right < numsSize; right++) {if (nums[right] != val) {nums[left] = nums[right];left++;}}return left;
}

在這里插入圖片描述

時 間 復 雜 度:O(N)
空 間 復 雜 度:O(1)

方 法 三 - - - 相 向 雙 指 針(面 對 面 移 動)

特 點

?????????兩 個 指 針 分 別 從 數 組 的 兩 端 出 發,相 向 移 動。

思 路 分 析

?????????設 左 指 針 位 于 數 組 的 首 位,右 指 針 位 于 數 組 的 末 尾,向 中 間 移 動 遍 歷 該 序 列。如 果 左 指 針 left 指 向 的 元 素 等 于 val,此 時 將 右 指 針 right 指 向 的 元 素 復 制 到 左 指 針 left 的 位 置,然 后 右 指 針 right 左 移 一 位。如 果 賦 值 過 來 的 元 素 恰 好 也 等 于 val,繼 續 把 右 指 針 right 指 向 的 元 素 的 值 賦 值 過 來(左 指 針 left 指 向 的 等 于 val 的 元 素 的 位 置 繼 續 被 覆 蓋),直 到 左 指 針 指 向 的 元 素 的 值 不 等 于 val 為 止。當 左 指 針 left 和 右 指 針 right 重 合 的 時 候,左 右 指 針 遍 歷 完 數 組 中 所 有 的 元 素。

這 里 以 示 例 1 為 例 進 行 演 示:

在這里插入圖片描述

溫 馨 提 示:讀 者 們 ,先 自 己 寫 代 碼,這 是 提 升 編 程 能 力 的 好 機 會。若 未 達 要 求 ,別 氣 餒 ,參 考 下 文 解 釋 會 有 新 收 獲。

下 面 展 示代 碼 示 例

int removeElement(int* nums, int numsSize, int val)
{int left = 0, right = numsSize;while (left < right) {if (nums[left] == val) {nums[left] = nums[right - 1];right--;} else {left++;}}return left;
}

時 間 復 雜 度:O(N)
空 間 復 雜 度:O(1)

第 二 題 - - - 刪 除 有 序 數 組 中 的 重 復 項

描 述:給 你 一個 非 嚴 格 遞 增 排 列 的 數 組 nums,請 你 原 地 刪 除 重 復 出 現 的 元 素,使 每 個 元 素 只 出 現 一 次 ,返 回 刪 除 后 數 組 的 新 長 度。元 素 的 相 對 順 序 應 該 保 持 一 致。然 后 返 回 nums 中 唯 一 元 素 的 個 數。

?????????考 慮 nums 的 唯 一 元 素 的 數 量 為 k,更 改 數 組 nums,使 nums 的 前 k 個 元 素 包 含 唯 一 元 素,并 按 照 它 們 最 初 在 nums 中 出 現 的 順 序 排 列。nums 的 其 余 元 素 與 nums 的 大 小 不 重 要。返 回 k。

示 例 1:
輸 入:nums = [1,1,2]
輸 出:2, nums = [1,2,_]
解 釋:函 數 應 該 返 回 新 的 長 度 2 ,并 且 原 數 組 nums 的 前 兩 個 元 素 被 修 改 為 1, 2 。不 需 要 考 慮 數 組 中 超 出 新 長 度 后 面 的 元 素。
示 例 2:
輸 入:nums = [0,0,1,1,1,2,2,3,3,4]
輸 出:5, nums = [0,1,2,3,4]
解 釋:函 數 應 該 返 回 新 的 長 度 5 , 并 且 原 數 組 nums 的 前 五 個 元 素 被 修 改 為 0, 1, 2, 3, 4。不 需 要 考 慮 數 組 中 超 出 新 長 度 后 面 的 元 素。

方 法 一 - - - 快 慢 指 針

思 路 分 析:題 目 要 求 去 除 數 組 中 的 重 復 元 素,并 且 題 目 強 調 使 數 組 的 前 k 個 元 素 包 含 唯 一 元 素,并 按 照 它 們 最 初 在 nums 中 出 現 的 順 序 排 列。可 以 使 用 雙 指 針 的 快 慢 指 針 求 解 這 個 問 題,慢 指 針 指 向 當 前 唯 一 元 素,快 指 針 遍 歷 數 組,發 現 不 同 元 素 時 更 新 慢 指 針。

溫 馨 提 示:讀 者 們 ,先 自 己 寫 代 碼,這 是 提 升 編 程 能 力 的 好 機 會。若 未 達 要 求 ,別 氣 餒 ,參 考 下 文 解 釋 會 有 新 收 獲。

下 面 展 示代 碼 示 例

int removeDuplicates(int* nums, int numsSize) 
{int left = 0;         //慢指針:指向當前無重復數組的最后位置int right = left + 1;        //快指針:從第二個元素開始遍歷while(right < numsSize)      //遍歷整個數組{if(nums[left] == nums[right]){right++;             //遇到重復元素,右移快指針}else{left++;              //找到新元素,更新慢指針位置nums[left] = nums[right]; //將新元素復制到慢指針位置}}return left + 1;  //返回無重復數組的長度(加上第1個元素)
}

空 間 復 雜 度 是 O(1)
時 間 復 雜 度 是 O(N)

方 法 二 - - - 改 進 方 法 一

?????????相 較 于 方 法 1,方 法 2 對 方 法 1 進 行 了 改 進,改 進 如 下:

邊 界 條 件 處 理:
增 加 了 numsSize == 0 的 判 斷,避 免 空 數 組 導 致 的 未 定 義 行 為。
指 針 初 始 化 優 化:
left 和 right 均 初 始 化 為 1,因 為 第 一 個 元 素(索 引 0)天 然 無 需 處 理。
比 較 邏 輯 簡 化:
通 過 比 較 nums[right-1] 和 nums[right],直 接 判 斷 當 前 元 素 是 否 與 前 一 個 重 復。當 發 現 不 重 復 元 素 時,直 接 賦 值 到 left 位 置,并 遞 增 left。

溫 馨 提 示:讀 者 們 ,先 自 己 寫 代 碼,這 是 提 升 編 程 能 力 的 好 機 會。若 未 達 要 求 ,別 氣 餒 ,參 考 下 文 解 釋 會 有 新 收 獲。

下 面 展 示代 碼 示 例

int removeDuplicates(int* nums, int numsSize) 
{if(numsSize == 0)           //處理空數組的邊界情況{return 0;}int left = 1;               //慢指針:從第二個位置開始寫入int right = 1;              //快指針:從第二個位置開始遍歷while(right < numsSize)     //遍歷整個數組{if(nums[right-1] != nums[right]) //當前元素與前一個不同{nums[left] = nums[right];   //將新元素寫入left位置left++;                     //移動left指針}right++;                    //無論如何都移動right指針}return left;                     //返回無重復數組的長度
}

時 間 復 雜 度 是 O(N)
空 間 復 雜 度 是 O(1)

在這里插入圖片描述

總 結

?????????至 此,關 于 雙 指 針 的 探 索 暫 告 一 段 落,但 你 的 編 程 征 程 才 剛 剛 啟 航。編 寫 代 碼 是 與 計 算 機 邏 輯 深 度 對 話,過 程 中 雖 會 在 結 構 設 計、算 法 實 現 的 困 境 里 掙 扎,但 這 些 磨 礪 加 深 了 對 代 碼 邏 輯 和 數 據 組 織 的 理 解。愿 你 合 上 電 腦 后,靈 感 不 斷,在 數 據 結 構 的 世 界 里 持 續 深 耕,書 寫 屬 于 自 己 的 編 程 傳 奇,下 一 次 開 啟,定 有 全 新 的 精 彩 等 待。小 編 期 待 重 逢,盼 下 次 閱 讀 時 見 證 你 們 更 大 的 進 步,共 赴 代 碼 之 約!

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

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

相關文章

設計模式系列(03):設計原則(二):DIP、ISP、LoD

本文為設計模式系列第3篇,聚焦依賴倒置、接口隔離、迪米特法則三大設計原則,系統梳理定義、實際業務場景、優缺點、最佳實踐與常見誤區,適合系統學習與團隊協作。 目錄 1. 引言2. 依賴倒置原則(DIP)3. 接口隔離原則(ISP)4. 迪米特法則(LoD)5. 常見誤區與反例6. 最佳實…

計算機圖形學中MVP變換的理論推導

計算機圖形學中MVP變換的理論推導 課程地址&#xff1a;Computing the Pixel Coordinates of a 3D Point 知識鋪墊&#xff1a;矩陣的真實內涵 矩陣的每一列/行&#xff08;左乘和右乘的區別&#xff09;代表了新坐標系的基向量在原基向量構成的坐標系中的坐標&#xff0c;這…

先說愛的人為什么先離開

2025年5月19日&#xff0c;15~23℃&#xff0c;賊好的一天&#xff0c;無事發生 待辦&#xff1a; 2024年稅務申報 《高等數學2》取消考試資格學生名單 《物理[2]》取消考試資格名單 5月24日、25日監考報名 《高等數學2》備課 《物理[2]》備課 職稱申報材料 教學技能大賽PPT 遇…

面試中的線程題

原文鏈接&#xff1a;線程題大全 Java 并發庫同步輔助類 CountDownLatch 工作機制&#xff1a;初始化一個計數器&#xff0c;此計數器的值表示需要等待的事件數量。 提供了兩個主要方法&#xff1a; await()&#xff1a;當一個線程調用此方法時&#xff0c;它將阻塞&#…

Linux夢開始的地方

1.概率 經過C語言&#xff0c;數據結構&#xff0c;C的學習我們現在要開始學習Linux的學習了。我們學習Linux是從四部分來進行的&#xff1a; 1.Linux初識&#xff0c;Linux環境&#xff0c;Linux指令&#xff0c;Linux開發環境。 2.Linux系統。 3.Linux網絡 4.MySQL Lin…

“二維前綴和”算法原理及模板

在學習本篇內容前建議先學習一下“一維前綴和” 一維前綴和 算法https://blog.csdn.net/czt230610/article/details/148012923?fromshareblogdetail&sharetypeblogdetail&sharerId148012923&sharereferPC&sharesourceczt230610&sharefromfrom_link接下來…

軟件設計師CISC與RISC考點分析——求三連

一、考點分值占比與趨勢分析&#xff08;CISC與RISC&#xff09; 綜合知識分值統計表 年份考題數量分值分值占比考察重點2018111.33%指令特征對比2019111.33%控制器實現方式2020222.67%寄存器數量/流水線技術2021111.33%尋址方式對比2022222.67%指令復雜度/譯碼方式2023111.3…

順 序 表:數 據 存 儲 的 “ 有 序 陣 地 ”

順 序 表&#xff1a;數 據 存 儲 的 “ 有 序 陣 地 ” 線 性 表順 序 表 - - - 順 序 存 儲 結 構順 序 表 的 操 作 實 現代 碼 全 貌 與 功 能 介 紹順 序 表 的 功 能 說 明代 碼 效 果 展 示代 碼 詳 解SeqList.hSeqList.ctest.c 總 結 &#x1f4bb;作 者 簡 介&#xf…

網絡安全深度解析:21種常見網站漏洞及防御指南

一、高危漏洞TOP 10 1. SQL注入(SQLi) 原理:通過構造惡意SQL語句突破系統過濾機制 典型場景: - 聯合查詢注入: union select 1,version(),3--+ - 布爾盲注:and (select substr(user(),1,1)=r) - 時間盲注:;if(now()=sysdate(),sleep(5),0)/ 防御方案: - 嚴格參數化查…

代碼上傳gitte倉庫

把代碼push上去就行

創建型:單例模式

目錄 1、核心思想 2、實現方式 2.1 餓漢式 2.2 懶漢式 2.3 枚舉&#xff08;Enum&#xff09; 3、關鍵注意事項 3.1 線程安全 3.2 反射攻擊 3.3 序列化與反序列化 3.4 克隆保護 4、適用場景 1、核心思想 目的&#xff1a;確保一個類僅有一個實例 功能&#xff1a;…

副業小程序YUERGS,從開發到變現

文章目錄 我為什么寫這個小程序網站轉小程序有什么坑有什么推廣渠道個人開發者如何變現簡單介紹YUERGS小程序給獨立開發者一點小建議 我為什么寫這個小程序 關注我的粉絲應該知道&#xff0c;我在碩士階段就已經掌握了小程序開發技能&#xff0c;并寫了一個名為“約球online”…

React路由(React學習筆記_09)

React路由 1,路由基礎 現代的前端應用大多都是SPA(單頁應用程序)&#xff0c;也就是只有一個HTML頁面的應用程序。因為它的用戶體驗更好、對服務器的壓力更小&#xff0c;所以更受歡迎。為了有效的使用單個頁面來管理原來多個頁面的功能&#xff0c;前端路由應運而生。 1, 安裝…

2009-2025計算機408統考真題及解析

整理2009-2025 年計算機408統考真題及解析PDF 目錄樹&#xff1a; └── 2025考研計算機408統考真題及答案&#xff08;回憶版&#xff09;.pdf ├── 2009-2024計算機408真題解析 │ ├── 2009年計算機408統考真題解析.pdf │ ├── 2010年計算機408統考真題解析.pdf …

Mysql、Oracle、Sql Server、達夢之間sql的差異

1&#xff1a;分頁查詢 Sql Server&#xff1a; <bind name"startRow" value"(page - 1) * limit 1"/> <bind name"endRow" value"page * limit"/> SELECT *FROM (SELECT ROW_NUMBER() OVER (<if test"sortZd!…

SQL Server 常用函數

一、字符串處理函數 1. CONCAT&#xff1a;拼接字符串 語法&#xff1a;CONCAT(string1, string2, ..., stringN) 實例&#xff1a; SELECT CONCAT(Hello, , World) AS Result; 輸出&#xff1a; Result ------------- Hello World 2. SUBSTRING&#xff1a;截取子字符串 …

【通用大模型】Serper API 詳解:搜索引擎數據獲取的核心工具

Serper API 詳解&#xff1a;搜索引擎數據獲取的核心工具 一、Serper API 的定義與核心功能二、技術架構與核心優勢2.1 技術實現原理2.2 對比傳統方案的突破性優勢 三、典型應用場景與代碼示例3.1 SEO 監控系統3.2 競品廣告分析 四、使用成本與配額策略五、開發者注意事項六、替…

ABP vNext 多租戶系統實現登錄頁自定義 Logo 的最佳實踐

&#x1f680; ABP vNext 多租戶系統實現登錄頁自定義 Logo 的最佳實踐 &#x1f9ed; 版本信息與運行環境 ABP Framework&#xff1a;v8.1.5.NET SDK&#xff1a;8.0數據庫&#xff1a;PostgreSQL&#xff08;支持 SQLServer、MySQL 等&#xff09;BLOB 存儲&#xff1a;本地…

FastDFS分布式文件系統架構學習(一)

FastDFS分布式文件系統架構學習 1. FastDFS簡介 FastDFS是一個開源的輕量級分布式文件系統&#xff0c;由淘寶資深架構師余慶設計并開發。它專為互聯網應用量身定制&#xff0c;特別適合以中小文件&#xff08;如圖片、文檔、音視頻等&#xff09;為載體的在線服務。FastDFS不…

基于單片機的防盜報警器設計與實現

標題:基于51單片機的防盜報警器設計 內容:1.摘要 本文圍繞基于51單片機的防盜報警器設計展開。背景在于現代社會安全需求不斷提高&#xff0c;傳統防盜方式存在諸多不足。目的是設計一款成本低、可靠性高且易于使用的防盜報警器。方法上&#xff0c;以51單片機為核心控制單元&…