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

【優(yōu)選算法】專題1 -- 雙指針 -- 復(fù)寫0

這篇具有很好參考價值的文章主要介紹了【優(yōu)選算法】專題1 -- 雙指針 -- 復(fù)寫0。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前言:

補充一下前文沒有寫到的雙指針入門知識:專題1 -- 雙指針 -- 移動零

目錄

基礎(chǔ)入門知識:

1. 復(fù)寫零(easy)

1. 題?鏈接:1089.復(fù)習(xí)0 - 力扣(LeetCode)

2. 題?描述:

3.算法原理:

異地操作

本地操作

【從后向前的復(fù)寫過程】

整體思路:

??1.先找到最后一個“復(fù)寫”的數(shù);

1.5 處理一下邊界情況:

??2."從后向前"完成復(fù)寫操作(前面已經(jīng)驗證)


基礎(chǔ)入門知識:

?的雙指針有兩種形式,?種是對撞指針,?種是左右指針。

對撞指針?般?于順序結(jié)構(gòu)中,也稱左右指針。

? 對撞指針從兩端向中間移動。?個指針從最左端開始,另?個從最右端開始,然后逐漸往中間逼近。

? 對撞指針的終?條件?般是兩個指針相遇或者錯開(也可能在循環(huán)內(nèi)部找到結(jié)果直接跳出循環(huán)),也就是:

? left == right (兩個指針指向同?個位置)

? left > right (兩個指針錯開)

快慢指針:?稱為?兔賽跑算法

其基本思想:就是使?兩個??移動速度??不同的指針在數(shù)組或鏈表等序列結(jié)構(gòu)上移動。

??這種?法對于處理環(huán)形鏈表或數(shù)組?常有?。

其實不單單是環(huán)形鏈表或者是數(shù)組,?如果我們要研究的問題出現(xiàn)循環(huán)往復(fù)的情況時,均可考慮使?快慢指針的思想。

??快慢指針的實現(xiàn)?式有很多種,最常?的?種就是:

? 在?次循環(huán)中,每次讓慢的指針向后移動?位,?快的指針往后移動兩位,實現(xiàn)?快?慢

1. 復(fù)寫零(easy)

1. 題?鏈接:1089.復(fù)習(xí)0 - 力扣(LeetCode)

2. 題?描述:

給你??度固定的整數(shù)數(shù)組 arr ,請你將該數(shù)組中出現(xiàn)的每個零都復(fù)寫?遍,并將其余的元素向右平移。

注意:請不要在超過該數(shù)組?度的位置寫?元素。請對輸?的數(shù)組就地進?上述修改,不要從函數(shù)返回任何東西。

?例 1:

?arr = [1,0,2,3,0,4,5,0]

輸出: [1,0,0,2,3,0,0,4]

解釋:

調(diào)?函數(shù)后,輸?的數(shù)組將被修改為: [1,0,0,2,3,0,0,4]

3.算法原理:

這題需要用到雙指針算法,但這不是憑空來的,原題目需要我們對原數(shù)組進行操作,

異地操作

??但是為了方便如何理解復(fù)寫 0?的過程,我們先畫出異地操作的過程:

原圖:

【優(yōu)選算法】專題1 -- 雙指針 -- 復(fù)寫0,優(yōu)選算法篇,算法,c++,c語言,編程語言,leetcode

復(fù)寫過程:

cur用于遍歷原數(shù)組,dest指向了異地操作的數(shù)組,

當(dāng)cur指向的元素為非0時,dest此時要復(fù)寫一次cur指向的非0元素,cur++,dest++

當(dāng)cur指向的元素為?0?時,dest要先復(fù)寫一次0,之后dest++,再復(fù)寫一次0,復(fù)寫兩次完畢之后cur++,dest++

【優(yōu)選算法】專題1 -- 雙指針 -- 復(fù)寫0,優(yōu)選算法篇,算法,c++,c語言,編程語言,leetcode

復(fù)寫完成:

【優(yōu)選算法】專題1 -- 雙指針 -- 復(fù)寫0,優(yōu)選算法篇,算法,c++,c語言,編程語言,leetcode

本地操作

優(yōu)化為本地操作后,嘗試從前往后操作:

【優(yōu)選算法】專題1 -- 雙指針 -- 復(fù)寫0,優(yōu)選算法篇,算法,c++,c語言,編程語言,leetcode

如果「從前向后」進?原地復(fù)寫操作的話,由于 0 的出現(xiàn)會復(fù)寫兩次導(dǎo)致沒有復(fù)寫的數(shù)「被覆
蓋掉」。

【優(yōu)選算法】專題1 -- 雙指針 -- 復(fù)寫0,優(yōu)選算法篇,算法,c++,c語言,編程語言,leetcode

驗證【從后往前】操作的可行性:

因此我們選擇「從后往前」的復(fù)寫策略,cur指向最后一個需要復(fù)寫的元素,dest指向最后一個需要復(fù)寫的位置(結(jié)果中的最后一個位置)??

這同時也是上面異地操作的結(jié)果:

【優(yōu)選算法】專題1 -- 雙指針 -- 復(fù)寫0,優(yōu)選算法篇,算法,c++,c語言,編程語言,leetcode

【從后向前的復(fù)寫過程】

【優(yōu)選算法】專題1 -- 雙指針 -- 復(fù)寫0,優(yōu)選算法篇,算法,c++,c語言,編程語言,leetcode

結(jié)果:我們可以看到,原地操作和異地操作最終的復(fù)寫結(jié)果是一樣的

【優(yōu)選算法】專題1 -- 雙指針 -- 復(fù)寫0,優(yōu)選算法篇,算法,c++,c語言,編程語言,leetcode

????????在這個示例里面,我們可以看到cur指向的4是最后一個需要復(fù)寫的元素,但是在其他示例里面我們不清楚,那么我們?nèi)绾握业阶詈笠粋€需要復(fù)寫的元素呢?

整體思路:

??1.先找到最后一個“復(fù)寫”的數(shù);

1.先判斷 cur 位置的值
2.決定 dest 向后移動一步或者兩步
3.判斷一下 dest 是否已經(jīng)到結(jié)束為止
4.cur++;

開始的狀態(tài):

【優(yōu)選算法】專題1 -- 雙指針 -- 復(fù)寫0,優(yōu)選算法篇,算法,c++,c語言,編程語言,leetcode

遍歷過程(動圖實現(xiàn)):【優(yōu)選算法】專題1 -- 雙指針 -- 復(fù)寫0,優(yōu)選算法篇,算法,c++,c語言,編程語言,leetcode

最終的狀態(tài):

【優(yōu)選算法】專題1 -- 雙指針 -- 復(fù)寫0,優(yōu)選算法篇,算法,c++,c語言,編程語言,leetcode

但是思考一下,此時如果cur指向的數(shù)組倒數(shù)第二個元素是0,那么dest此時指向的位置將會是數(shù)組最后一個元素的位置的下一個位置,因為上面遍歷的方式是遇到 0 則++兩次,非0是一次,那么必定會造成數(shù)組越界:【優(yōu)選算法】專題1 -- 雙指針 -- 復(fù)寫0,優(yōu)選算法篇,算法,c++,c語言,編程語言,leetcode

1.5 處理一下邊界情況:

arr[n - 1] = 0;

cur--;

dest -= 2;

【優(yōu)選算法】專題1 -- 雙指針 -- 復(fù)寫0,優(yōu)選算法篇,算法,c++,c語言,編程語言,leetcode

??2."從后向前"完成復(fù)寫操作(前面已經(jīng)驗證)

【優(yōu)選算法】專題1 -- 雙指針 -- 復(fù)寫0,優(yōu)選算法篇,算法,c++,c語言,編程語言,leetcode

代碼實現(xiàn):

class Solution {
public:
    void duplicateZeros(vector<int>& arr) {
    int cur = 0,dest = -1,n=arr.size();
    
    //1.先找到最后一個需要復(fù)寫的數(shù)
    while(cur<n)
    {
        if(arr[cur])
            dest++;
        else
            dest+=2;
        if(dest>=n-1)//數(shù)組最后一個位置或者最后一個位置的下個位置
            break;
        cur++;
        }
    //2.處理一下邊界情況
    if(dest == n)
    {
        arr[n-1] = 0;
        cur--;
        dest-=2;
    }
    //3.從后往前完成復(fù)寫操作
    while(cur >= 0)
    {
        if(arr[cur])
        {
           arr[dest--] = arr[cur--];
           //arr[dest] = arr[cur],cur--,dest--
        }
        else
        {
           arr[dest--] = 0;
           arr[dest--] = 0;
           cur--;
        }
    }
    }
};

【優(yōu)選算法】專題1 -- 雙指針 -- 復(fù)寫0,優(yōu)選算法篇,算法,c++,c語言,編程語言,leetcode?

本篇完結(jié)。?

??本文修改次數(shù):0

??更新時間:2024年3月26日??文章來源地址http://www.zghlxwxcb.cn/news/detail-854624.html

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

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

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【算法優(yōu)選】雙指針專題——叁

    常?的雙指針有兩種形式,?種是 對撞指針 ,?種是 左右指針 對撞指針 :?般?于順序結(jié)構(gòu)中,也稱左右指針。 對撞指針從兩端向中間移動。?個指針從最左端開始,另?個從最右端開始,然后逐漸往中間逼近。 對撞指針的終?條件?般是兩個指針相遇或者錯開(也可能

    2024年02月08日
    瀏覽(20)
  • 算法初階雙指針+C語言期末考試之編程題加強訓(xùn)練

    算法初階雙指針+C語言期末考試之編程題加強訓(xùn)練

    常?的雙指針有兩種形式,?種是對撞指針,?種是左右指針。 對撞指針:?般?于順序結(jié)構(gòu)中,也稱左右指針。 ? 對撞指針從兩端向中間移動。?個指針從最左端開始,另?個從最右端開始,然后逐漸往中間逼 近。 ? 對撞指針的終?條件?般是兩個指針相遇或者錯開(

    2024年02月05日
    瀏覽(18)
  • 【編程語言 · C語言 · 函數(shù)指針】

    由于指針可以指向任何存儲器位置中的地址,因此它們也可以指向可執(zhí)行代碼的開頭。 函數(shù)指針或函數(shù)指針指向內(nèi)存中函數(shù)的可執(zhí)行代碼。函數(shù)指針可以存儲在數(shù)組中,也可以作為參數(shù)傳遞給其他函數(shù)。 函數(shù)指針聲明使用 * 就像使用任何指針一樣: (*func_name)? 周圍的括號很

    2024年02月10日
    瀏覽(26)
  • Rust編程語言入門之智能指針

    指針:一個變量在內(nèi)存中包含的是一個地址(指向其它數(shù)據(jù)) Rust 中最常見的指針就是”引用“ 引用: 使用 借用它指向的值 沒有其余開銷 最常見的指針類型 智能指針是這樣一些數(shù)據(jù)結(jié)構(gòu): 行為和指針相似 有額外的元數(shù)據(jù)和功能 通過記錄所有者的數(shù)量,使一份數(shù)據(jù)被多個

    2023年04月16日
    瀏覽(26)
  • 深入淺出 C 語言:學(xué)變量、掌控流程、玩指針,全方位掌握 C 編程技能

    C 語言介紹 C 語言的特性 C 語言相對于其他語言的優(yōu)勢 C 程序的編譯 C 中的 Hello World 程序 參考文章: C 語言入門:如何編寫 Hello World C 語言函數(shù):入門指南 C 中的變量和 C 語言中的作用域規(guī)則 C 中的數(shù)據(jù)類型 運算符及其類型 C 語言中的類型轉(zhuǎn)換 參考文章: C 語言注釋

    2024年02月02日
    瀏覽(24)
  • c語言編程中出現(xiàn)錯誤: 表達式必須包含指向?qū)ο蟮闹羔橆愋汀?該錯誤如何解決? 下文解答

    c語言編程中出現(xiàn)錯誤: 表達式必須包含指向?qū)ο蟮闹羔橆愋汀?該錯誤如何解決? 下文解答

    表達式必須包含指向?qū)ο蟮闹羔橆愋?,但他具有類型\\\"int\\\" 具體原因是因為arr數(shù)組本質(zhì)是一個指針類型,指向的是首元素的地址,如果用int 來接收顯然不合適,以至于在引用下列定義的int類型的變量時候產(chǎn)生錯誤——表達式必須包含指向?qū)ο蟮闹羔橆愋?,但他具有類型\\\"int\\\",解決

    2024年02月11日
    瀏覽(20)
  • 【算法】活用雙指針完成復(fù)寫零操作

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

    Problem: 1089. 復(fù)寫零 首先我們來分析一下本題的題目意思 可以看到題目中給到了一個數(shù)組,意思是讓我們將數(shù)組中的零元素都復(fù)寫一遍,然后將其余的元素向后平移 光就上面這樣來看還是不太形象,我們通過畫圖來分析一下,通過下圖我們可以看到,凡是0的都復(fù)寫了兩遍,凡

    2024年02月11日
    瀏覽(23)
  • 【算法優(yōu)選】 二分查找專題——貳

    【算法優(yōu)選】 二分查找專題——貳

    二分查找也稱折半查找(Binary Search),它是一種效率較高的查找方法。但是,折半查找要求線性表必須采用 順序存儲結(jié)構(gòu) ,而且表中元素按 有序排列 。 查找過程 : 首先,假設(shè)表中元素是按升序排列,將表中間位置記錄的與查找比較,如果兩者相等,

    2024年02月08日
    瀏覽(18)
  • 【算法優(yōu)選】 滑動窗口專題——壹

    基本概念 滑動窗口是一種 基于雙指針 的一種思想,兩個指針指向的元素之間形成一個窗口。 分類:窗口有兩類,一種是 固定大小類 的窗口,一類是 大小動態(tài)變化 的窗口。 給定一個含有 n 個正整數(shù)的數(shù)組和一個正整數(shù) target 。 找出該數(shù)組中滿足其總和大于等于 target 的長

    2024年02月08日
    瀏覽(21)
  • 【算法優(yōu)選】前綴和專題——叁

    【算法優(yōu)選】前綴和專題——叁

    含義 : 前綴和實際上就是對于長度為n的數(shù)組, 我們新建立一個數(shù)組長度為n+1,第i個元素的值為前i個元素的和(包括第i個元素) 。 特點 : 前綴和數(shù)組比原數(shù)組多一個長度。 前綴和的第0個元素的值為0。 根據(jù)前綴和數(shù)組的特點,求前綴和時。我們只需要用第i個元素的值

    2024年02月06日
    瀏覽(18)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包