国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【算法】活用雙指針完成復寫零操作

這篇具有很好參考價值的文章主要介紹了【算法】活用雙指針完成復寫零操作。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

【算法】活用雙指針完成復寫零操作,# 雙指針,算法

Problem: 1089. 復寫零

題目解析

首先我們來分析一下本題的題目意思

  • 可以看到題目中給到了一個數(shù)組,意思是讓我們將數(shù)組中的零元素都復寫一遍,然后將其余的元素向后平移

【算法】活用雙指針完成復寫零操作,# 雙指針,算法

  • 光就上面這樣來看還是不太形象,我們通過畫圖來分析一下,通過下圖我們可以看到,凡是0的都復寫了兩遍,凡不是0的都復寫了一遍

【算法】活用雙指針完成復寫零操作,# 雙指針,算法

  • 但是呢題目中很明顯地講到只能讓我們在數(shù)組上進行就地操作,但是就我們上面的操作而言則是在另外開辟了一塊數(shù)組的空間

那在下面我們就去考慮一下在數(shù)組原地的操作

  • 可以看到在下面我使用到了雙指針的操作,若是cur遍歷到0的話就進行兩次的復寫操作,不過呢大家可以看到在第一次的復寫操作完成之后,【2】被覆蓋了,但是這個【2】是我們需要的,那也就造成了一定的問題

【算法】活用雙指針完成復寫零操作,# 雙指針,算法

?? 那么反應快的同學可以意識到,如果要進行覆蓋操作的話就需要 從后往前 進行遍歷操作才可以

算法原理分析

好,接下去呢我們就來分析一下解決本題的思路

找到最后一個復寫的位置

  • 上面說到是要從后往前開始做復寫操作,那么第一步我們所要做的就是找到最后一個復寫的位置,即讓這個dest指向最后的0

【算法】活用雙指針完成復寫零操作,# 雙指針,算法

那要怎么去找呢?(頭一次嘗試幻燈片≧ ﹏ ≦)

可以分為以下幾步:

  1. 判斷cur位置的值,決定dest走一步還是兩步
  2. 判斷dest是否到達末尾,決定cur是否++

<【算法】活用雙指針完成復寫零操作,# 雙指針,算法,【算法】活用雙指針完成復寫零操作,# 雙指針,算法,【算法】活用雙指針完成復寫零操作,# 雙指針,算法,【算法】活用雙指針完成復寫零操作,# 雙指針,算法,【算法】活用雙指針完成復寫零操作,# 雙指針,算法,【算法】活用雙指針完成復寫零操作,# 雙指針,算法,【算法】活用雙指針完成復寫零操作,# 雙指針,算法>


但是呢,就上面這樣的邏輯去走的話其實是不對的,因為我們還未考慮到特殊的邊界情況

  • 即下面的這種情況,當測試用例的倒數(shù)第二個數(shù)為0的時候,此時dest又剛好到這個位置,那么就需要向后移動兩步,此時就造成了越界問題

【算法】活用雙指針完成復寫零操作,# 雙指針,算法

所以此時我們應該要考慮處理一下這個邊界問題

  • 因為倒數(shù)第二個數(shù)為0,那么對其進行復寫操作的話,最后一個也是0,我們將其做一個修改即可,不過呢兩個指針curdest也需要去做一個變化,cur前移一位即可,dest因為做了復寫操作,所以需要前移兩位

【算法】活用雙指針完成復寫零操作,# 雙指針,算法

從后往前進行復寫操作

上面呢,我們已經(jīng)找到了需要復寫的最后一個位置,那接下去我們就要正式開始復寫操作了

  • 這一塊的話就不做動畫演示了,讀者可以試著自己去手動模擬一下,也就是從我們上面所找到的cur位置開始,慢慢地向前遍歷然后去做復寫操作即可,將數(shù)一一地復寫到dest所在的位置,如果arr[cur]為0的話,那我們就需要考慮復寫兩次了

【算法】活用雙指針完成復寫零操作,# 雙指針,算法

代碼展示

最后來展示一下整體的代碼

class Solution {
public:
    void duplicateZeros(vector<int>& arr) {
        // 1.找到復寫的最后一個位置
            // (1) 判斷cur位置的值,決定dest走一步還是兩步
            // (2) 判斷dest是否到達末尾,決定cur是否++
        int dest = -1;
        int cur = 0;
        int sz = arr.size();
        while(dest < sz)
        {
            if(arr[cur])  dest++;
            else   dest += 2;
            if(dest >= sz - 1)
                break;
            cur++;
        }

        // 2.判斷邊界的情況
        if(dest == sz)
        {
            arr[dest - 1] = 0;
            cur--;
            dest -= 2;
        }     

        // 3.從右往左復寫0
        while(cur >= 0)
        {
            if(arr[cur]) arr[dest--] = arr[cur--];
            else
            {
                arr[dest--] = 0;
                arr[dest--] = 0;
                cur--;
            }
        }   
    }
};

下面是運行后的結(jié)果

【算法】活用雙指針完成復寫零操作,# 雙指針,算法

【算法】活用雙指針完成復寫零操作,# 雙指針,算法文章來源地址http://www.zghlxwxcb.cn/news/detail-667939.html

到了這里,關(guān)于【算法】活用雙指針完成復寫零操作的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關(guān)文章

  • 【算法專題--雙指針算法】leetcode--283. 移動零、leetcode--1089. 復寫零

    【算法專題--雙指針算法】leetcode--283. 移動零、leetcode--1089. 復寫零

    ??你好,我是 RO-BERRY ?? 致力于C、C++、數(shù)據(jù)結(jié)構(gòu)、TCP/IP、數(shù)據(jù)庫等等一系列知識 ??感謝你的陪伴與支持 ,故事既有了開頭,就要畫上一個完美的句號,讓我們一起加油 雙指針 常見的雙指針有兩種形式,一種是對撞指針,?種是左右指針。 對撞指針:一般用于順序結(jié)構(gòu)中

    2024年03月17日
    瀏覽(29)
  • LeetCode —— 復寫零(雙指針)

    LeetCode —— 復寫零(雙指針)

    力扣(LeetCode)官網(wǎng) - 全球極客摯愛的技術(shù)成長平臺 將數(shù)組中出現(xiàn)的每個零復寫一遍,然后將其他元素向右平移,數(shù)組長度不能改變。 ? ? ?

    2024年02月10日
    瀏覽(16)
  • [雙指針](一) Leetcode 283.移動零和1089.復寫零

    [雙指針](一) Leetcode 283.移動零和1089.復寫零

    [雙指針] Leetcode 283.移動零和1089.復寫零 移動零 283. 移動零 1.題意分析 (1) 給你一個數(shù)組,將數(shù)組中的 所有0移動到數(shù)組的末尾 (2) 保證非0元素在數(shù)組中 相對位置不變 (3) 在原數(shù)組中操作 2.解題思路 由于題目要求我們移動數(shù)組內(nèi)容(也就是交換兩個數(shù)的位置),所以我們很容易

    2024年02月08日
    瀏覽(17)
  • 對無向圖進行鄰接矩陣的轉(zhuǎn)化,并且利用DFS(深度優(yōu)先)和BFS(廣度優(yōu)先)算法進行遍歷輸出, 在鄰接矩陣存儲結(jié)構(gòu)上,完成最小生成樹的操作。

    對無向圖進行鄰接矩陣的轉(zhuǎn)化,并且利用DFS(深度優(yōu)先)和BFS(廣度優(yōu)先)算法進行遍歷輸出, 在鄰接矩陣存儲結(jié)構(gòu)上,完成最小生成樹的操作。

    目錄 一 實驗目的 二 實驗內(nèi)容及要求 實驗內(nèi)容: 實驗要求: 三 實驗過程及運行結(jié)果 一 算法設計思路 二 源程序代碼 三、截圖 四 調(diào)試情況、設計技巧及體會 1.掌握圖的相關(guān)概念。 2.掌握用鄰接矩陣和鄰接表的方法描述圖的存儲結(jié)構(gòu)。 3.掌握圖的深度優(yōu)先搜索和廣度優(yōu)

    2024年02月04日
    瀏覽(25)
  • 【Verilog】用雙口RAM實現(xiàn)同步FIFO

    【Verilog】用雙口RAM實現(xiàn)同步FIFO

    端口說明如下表。 雙口RAM端口說明: 同步FIFO端口說明: 輸入描述: input clk , input rst_n , input winc , input rinc , input [WIDTH-1:0] wdata 輸出描述: output reg wfull , output reg rempty , output wire [WIDTH-1:0] rdata 雙口RAM和代碼框架: 同步FIFO,就是我們學習其他經(jīng)典計算機語言(如C語言)的數(shù)據(jù)結(jié)

    2024年02月07日
    瀏覽(20)
  • 活用 命令行通配符

    活用 命令行通配符

    本文是對 阮一峰老師 命令行通配符教程 [1] 的學習與記錄 通配符早于正則表達式出現(xiàn),可以看作是原始的正則表達式. 其功能沒有正則那么強大靈活,而勝在簡單和方便. - 字符 切回上一個路徑/分支 如圖: !! 代表上一個命令, 如圖: [Linux中“!\\\"的神奇用法](https://www.cnblogs.com/bian

    2024年02月10日
    瀏覽(25)
  • Python 字符串應該用雙引號還是單引號?

    Python 字符串應該用雙引號還是單引號?

    PyCharm升級至 2023.2版本后,經(jīng)常彈出來一個提示問我要不要試一下Black formatter。 試了一下,這個Black formatter 很有個性,特別喜歡換行。我的一個文件用PyCharm自帶的代碼整理器整理完之后是500行左右,然后再用Black整理就變成600多行了。 原來Black是Python Software Foundation主導的開

    2024年04月16日
    瀏覽(14)
  • react經(jīng)驗9:循環(huán)渲染的語法活用

    在react中,循環(huán)渲染一般這么寫 react語法規(guī)定每個循環(huán)的標簽需要加不重復的key,只能有一個根標簽。 如果一次循環(huán)要輸出多個標簽怎么辦? 這個例子是一次循環(huán)輸出兩個標簽,key加在了Fragment上。 Fragment在react中表示空標簽,用于向語法妥協(xié)的占位,平時可簡寫為\\\"/\\\" 在需要

    2024年01月20日
    瀏覽(19)
  • 探索stable-diffusion技術(shù)樂園:活學活用界面參數(shù)

    探索stable-diffusion技術(shù)樂園:活學活用界面參數(shù)

    嗨!歡迎踏入我們充滿有趣和創(chuàng)新的stable-diffusion技術(shù)樂園,讓我們一起走進stable-diffusion界面參數(shù)的世界,看看怎樣如行家袋里取物般自在地活用這些參數(shù)! 看了這么多大V、大卡和群粉們使用的英文,提起來有點沉,別急,我會盡量使用輕松的語氣帶你一起探索這些小秘密。

    2024年02月15日
    瀏覽(12)
  • 活用 F12 開發(fā)者工具,測試效率原來可以提高這么多

    活用 F12 開發(fā)者工具,測試效率原來可以提高這么多

    F12開發(fā)者工具是瀏覽器自帶的一個開發(fā)調(diào)試工具,因為可以用F12快捷鍵直接啟動,所以簡稱為F12工具。 F12工具因為有如下的特點,所以被開發(fā)和測試人員廣泛使用: 1.簡單輕量免安裝,是瀏覽器內(nèi)置的開發(fā)者工具,可以提供捕獲瀏覽器的數(shù)據(jù)報文的功能; 2.作為瀏覽器的一部

    2024年02月04日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包