主頁 >  其他 > ??思維導圖整理大廠面試高頻陣列9: 洗掉重復元素的通解問題, 力扣26/80??

??思維導圖整理大廠面試高頻陣列9: 洗掉重復元素的通解問題, 力扣26/80??

2021-09-04 07:24:08 其他

此專欄文章是對力扣上演算法題目各種方法總結和歸納, 整理出最重要的思路和知識重點并以思維導圖形式呈現, 當然也會加上我對導圖的詳解.

目的是為了更方便快捷的記憶和回憶演算法重點(不用每次都重復看題解), 畢竟演算法不是做了一遍就能完全記住的. 所以本文適合已經知道解題思路和方法, 想進一步加強理解和記憶的朋友, 并不適合第一次接觸此題的朋友(可以根據題號先去力扣看看官方題解, 然后再看本文內容).

關于本專欄所有題目的目錄鏈接, 刷演算法題目的順序/注意點/技巧, 以及思維導圖源檔案問題請點擊此鏈接.

想進大廠, 刷演算法是必不可少的, 歡迎和博主一起打卡刷力扣演算法, 博主同步更新了演算法視頻講解 和 其他文章/導圖講解, 更易于理解, 歡迎來看!

文章目錄

    • 0.導圖整理
    • 1.雙指標的快慢指標法
    • 2.和 移除元素 的不同
    • 3.本題的進階版:每個元素最多出現兩次
    • 4.本題的通解擴展
    • 原始碼
      • Python:
      • java:

題目鏈接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/

https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array-ii/

0.導圖整理

1.雙指標的快慢指標法

上一篇 移除元素 使用的方法就是雙指標的快慢指標法, 這個方法使用最重要的點就是 明確快慢指標分別代表的含義, 寫代碼之前一定要明確兩者的具體含義, 再來寫代碼就比較容易了.

比如在 移除元素 之中, 我們使用的雙指標: 右指標right指向當前將要處理的元素, 左指標left指向下一個將要賦值的位置. 其實在本題 洗掉有序陣列的重復項 中, 兩個指標的含義和 移除元素 之中的含義是完全相同的: 定義兩個指標 fast 和 slow 分別為快指標和慢指標, 快指標表示遍歷陣列到達的下標位置, 慢指標表示下一個不同元素要填入的下標位置. 在表達上有點差別, 但是本質的思想是完全一致的.

2.和 移除元素 的不同

雖然在雙指標的使用上, 兩者的思想是一致的, 但是具體的使用程序還是有點區別的.

在 移除元素 中, 我們 需要比較的物件 是題目中的給定值, 而且是唯一固定的, 從頭到尾都是沒有任何變化的.

但是在本題中, 我們 需要比較的物件 不再是某個固定的元素了, 而是 快指標指向位置的前一個元素和當前元素的比較, 因為這樣比較, 才能確定兩個相鄰的元素是否為 重復元素, 從而決定是否要保留當前元素, 這是兩題最大的不同點.

還有一個小細節注意下, 因為 移除元素 中被移除的元素可能是任意一個位置的元素, 所以兩個指標的下標都是 從0開始 的. 但是在本題中, 陣列的第一個元素一定是被保留下來的元素, 所以我們直接從 第二個元素 開始遍歷就可以了, 也就是 雙指標的下標都是從1開始的.

3.本題的進階版:每個元素最多出現兩次

進階版和原題的唯一區別就是: 并不是要把所有重復元素都刪去, 而是允許 每個元素最多出現兩次. 改動看似挺簡單, 實則是有一定的難度的, 這也直接讓本題由 簡單 直接提升到 中等 的難度.

如果沒有想通此題的變化, 還是比較難處理的, 很多人也有想到用一個count變數來記錄每個元素出現的次數, 兩次就不處理, 超過兩次就進行洗掉等方法, 但真正實施起來還是有點繞的, 有興趣的朋友可以自己嘗試一下.

我們直接來分析改進后的不同, 也就是進行比較的兩個元素變化了. 在原本的題目中, 只需要比較 快指標指向位置的前一個元素和當前元素 即可滿足要求, 但是此題明顯復雜的多.

首先由于我們并不知道哪些元素會重復多少次, 所以想直接通過快指標指向的元素進行區別是很困難的, 但是這時我們還可以利用慢指標來進行比較. 分析后會發現, 慢指標之前的所有元素都是我們處理好的元素, 也就是 每個元素最多出現兩次, 所以如果 當前待檢查元素 nums[fast] 和 nums[slow?2] 相同的話, 那么它的出現必然就超過了兩次, 因為此時必然有nums[slow?2]=nums[slow?1]=nums[fast], 反正如果不相同, 也就代表 它的出現沒有超過兩次, 這樣我們就找到了 兩個需要比較的物件了, 此題也就沒什么難點了.

4.本題的通解擴展

既然都已經擴展到了 每個元素最多出現兩次了, 那么同樣可以擴展為 每個元素最多出現k次, 這樣就形成了此題的通解問題, 解決了這個問題, 只需把k替換一下, 我們就可以解決任意次數的問題了.

有了兩次的經驗之后, 其實這個擴展也很容易就理解了, 能夠保留的前提是:與當前寫入的位置前面的第 k 個元素進行比較,不相同則保留, 也就是直接比較 nums[slow - k] 和 nums[fast] 兩個元素即可, 在兩次的代碼上稍微修改下就能實作了, 這樣我們就成功的將這一類問題完美的解決了!

原始碼

Python:

# 洗掉有序陣列的重復項
class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        if not nums:
            return 0
        
        n = len(nums)
        fast = slow = 1 # 洗掉重復元素之后也至少剩下一個元素
        while fast < n:
            if nums[fast] != nums[fast - 1]: # 說明nums[fast] 和之前的元素都不同
                nums[slow] = nums[fast]      # nums[fast] 的值復制到 nums[slow]
                slow += 1
            fast += 1
        
        return slow # 從nums[0]到nums[slow?1]的每個元素都不相同
        
# 洗掉有序陣列中的重復項II 每個元素最多出現兩次
class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        n = len(nums)
        if (n <= 2) :
            return n
        
        slow, fast = 2, 2 # 陣列的前兩個數必然可以被保留
        while (fast < n) :
            # 檢查上上個應該被保留的元素nums[slow?2]是否和當前待檢查元素nums[fast]相同
            if nums[slow - 2] != nums[fast] :
                nums[slow] = nums[fast]
                slow += 1
            fast += 1
        
        return slow # 從nums[0]到nums[slow?1]的每個元素都不相同
        
# 通解擴展
class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        def solve(k): # 最多保留k位相同數字
            slow = 0 # 慢指標從0開始
            for fast in nums: # 快指標遍歷整個陣列
                # 檢查被保留的元素nums[slow?k]是否和當前待檢查元素fast相同
                if slow < k or nums[slow - k] != fast:
                    nums[slow] = fast
                    slow += 1
            return slow # 從nums[0]到nums[slow?1]的每個元素都不相同
        return solve(2)

java:

// 洗掉有序陣列的重復項
class Solution {
    public int removeDuplicates(int[] nums) {
        int n = nums.length;
        if (n == 0) {
            return 0;
        }
        int fast = 1, slow = 1; // 洗掉重復元素之后也至少剩下一個元素
        while (fast < n) {
            if (nums[fast] != nums[fast - 1]) { // 說明nums[fast] 和之前的元素都不同
                nums[slow] = nums[fast];        // nums[fast] 的值復制到 nums[slow]
                ++slow;
            }
            ++fast;
        }
        return slow; // 從nums[0]到nums[slow?1]的每個元素都不相同
    }
}

// 洗掉有序陣列中的重復項II 每個元素最多出現兩次
class Solution {
    public int removeDuplicates(int[] nums) {
        int n = nums.length;
        if (n <= 2) {
            return n;
        }
        int slow = 2, fast = 2; // 陣列的前兩個數必然可以被保留
        while (fast < n) {
            // 檢查上上個應該被保留的元素nums[slow?2]是否和當前待檢查元素nums[fast]相同
            if (nums[slow - 2] != nums[fast]) {
                nums[slow] = nums[fast];
                ++slow;
            }
            ++fast;
        }
        return slow; // 從nums[0]到nums[slow?1]的每個元素都不相同
    }
}

// 通解擴展
class Solution {
    public int removeDuplicates(int[] nums) {   
        return process(nums, 2);
    }
    int process(int[] nums, int k) { // 最多保留k位相同數字
        int slow = 0; // 慢指標從0開始
        for (int fast : nums) { // 快指標遍歷整個陣列
            // 檢查被保留的元素nums[slow?k]是否和當前待檢查元素fast相同
            if (slow < k || nums[slow - k] != fast) nums[slow++] = fast;
        }
        return slow; // 從nums[0]到nums[slow?1]的每個元素都不相同
    }
}

感覺作者寫的不錯的, 別忘了點贊關注加收藏哦(一鍵三連)!你的支持會帶給我極大的動力, 寫出更多優秀文章!

我的更多精彩文章鏈接, 歡迎查看

各種電腦/軟體/生活/音樂/動漫/電影技巧匯總(你肯定能夠找到你需要的使用技巧)

力扣演算法刷題 根據思維導圖整理筆記快速記憶演算法重點內容(歡迎和博主一起打卡刷題哦)

計算機專業知識 思維導圖整理

最值得收藏的 Python 全部知識點思維導圖整理, 附帶常用代碼/方法/庫/資料結構/常見錯誤/經典思想(持續更新中)

最值得收藏的 C++ 全部知識點思維導圖整理(清華大學鄭莉版), 東南大學軟體工程初試906科目

最值得收藏的 計算機網路 全部知識點思維導圖整理(王道考研), 附帶經典5層結構中英對照和框架簡介

最值得收藏的 演算法分析與設計 全部知識點思維導圖整理(北大慕課課程)

最值得收藏的 資料結構 全部知識點思維導圖整理(王道考研), 附帶經典題型整理

最值得收藏的 人工智能導論 全部知識點思維導圖整理(王萬良慕課課程)

最值得收藏的 數值分析 全部知識點思維導圖整理(東北大學慕課課程)

最值得收藏的 數字影像處理 全部知識點思維導圖整理(武漢大學慕課課程)

紅黑樹 一張導圖解決紅黑樹全部插入和洗掉問題 包含詳細操作原理 情況對比

各種常見排序演算法的時間/空間復雜度 是否穩定 演算法選取的情況 改進 思維導圖整理

人工智能課件 演算法分析課件 Python課件 數值分析課件 機器學習課件 影像處理課件

考研相關科目 知識點 思維導圖整理

考研經驗–東南大學軟體學院軟體工程(這些基礎課和專業課的各種坑和復習技巧你應該知道)

東南大學 軟體工程 906 資料結構 C++ 歷年真題 思維導圖整理

東南大學 軟體工程 復試3門科目歷年真題 思維導圖整理

最值得收藏的 考研高等數學 全部知識點思維導圖整理(張宇, 湯家鳳), 附做題技巧/易錯點/知識點整理

最值得收藏的 考研線性代數 全部知識點思維導圖整理(張宇, 湯家鳳), 附帶慣用思維/做題技巧/易錯點整理

高等數學 中值定理 一張思維導圖解決中值定理所有題型

考研思修 知識點 做題技巧 同類比較 重要會議 1800易錯題 思維導圖整理

考研近代史 知識點 做題技巧 同類比較 重要會議 1800易錯題 思維導圖整理

考研馬原 知識點 做題技巧 同類比較 重要會議 1800易錯題 思維導圖整理

考研數學課程筆記 考研英語課程筆記 考研英語單詞詞根詞綴記憶 考研政治課程筆記

Python相關技術 知識點 思維導圖整理

Numpy常見用法全部OneNote筆記 全部筆記思維導圖整理

Pandas常見用法全部OneNote筆記 全部筆記思維導圖整理

Matplotlib常見用法全部OneNote筆記 全部筆記思維導圖整理

PyTorch常見用法全部OneNote筆記 全部筆記思維導圖整理

Scikit-Learn常見用法全部OneNote筆記 全部筆記思維導圖整理

Java相關技術/ssm框架全部筆記

Spring springmvc Mybatis jsp

科技相關 小米手機

小米 紅米 歷代手機型號大全 發布時間 發布價格

常見手機品牌的各種系列劃分及其特點

歷代CPU和GPU的性能情況和常見后綴的含義 思維導圖整理

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/297296.html

標籤:其他

上一篇:熬夜爆肝!C++核心STL容器知識點匯總整理【3W字干貨預警 建議收藏】

下一篇:【忙里偷閑一下午總結:全網最全最細】Linux實時監測CPU 溫度,拿來即用版本,親測無例外,建議收藏

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more