chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

一個(gè)小而美的算法技巧:差分?jǐn)?shù)組

算法與數(shù)據(jù)結(jié)構(gòu) ? 來(lái)源:labuladong ? 作者:labuladong ? 2020-09-21 15:54 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

本文給大家介紹一個(gè)小而美的算法技巧:差分?jǐn)?shù)組。

讀完本文,你可以去解決力扣第 1109 題「航班預(yù)訂統(tǒng)計(jì)」,難度Medium

差分?jǐn)?shù)組技巧是前文前綴和技巧詳解寫(xiě)過(guò)的前綴和技巧的兄弟。

前綴和主要適用的場(chǎng)景是原始數(shù)組不會(huì)被修改的情況下,頻繁查詢某個(gè)區(qū)間的累加和。

沒(méi)看過(guò)前文沒(méi)關(guān)系,這里簡(jiǎn)單介紹一下前綴和,核心代碼就是下面這段:

classPrefixSum{ //前綴和數(shù)組 privateint[]prefix; /*輸入一個(gè)數(shù)組,構(gòu)造前綴和*/ publicPrefixSum(int[]nums){ prefix=newint[nums.length+1]; //計(jì)算nums的累加和 for(inti=1;i

prefix[i]就代表著nums[0..i-1]所有元素的累加和,如果我們想求區(qū)間nums[i..j]的累加和,只要計(jì)算prefix[j+1] - prefix[i]即可,而不需要遍歷整個(gè)區(qū)間求和。

本文講一個(gè)和前綴和思想非常類似的算法技巧「差分?jǐn)?shù)組」,差分?jǐn)?shù)組的主要適用場(chǎng)景是頻繁對(duì)原始數(shù)組的某個(gè)區(qū)間的元素進(jìn)行增減。

比如說(shuō),我給你輸入一個(gè)數(shù)組nums,然后又要求給區(qū)間nums[2..6]全部加 1,再給nums[3..9]全部減 3,再給nums[0..4]全部加 2,再給…

一通操作猛如虎,然后問(wèn)你,最后nums數(shù)組的值是什么?

常規(guī)的思路很容易,你讓我給區(qū)間nums[i..j]加上val,那我就一個(gè) for 循環(huán)給它們都加上唄,還能咋樣?這種思路的時(shí)間復(fù)雜度是 O(N),由于這個(gè)場(chǎng)景下對(duì)nums的修改非常頻繁,所以效率會(huì)很低下。

這里就需要差分?jǐn)?shù)組的技巧,類似前綴和技巧構(gòu)造的prefix數(shù)組,我們先對(duì)nums數(shù)組構(gòu)造一個(gè)diff差分?jǐn)?shù)組,diff[i]就是nums[i]和nums[i-1]之差:

int[]diff=newint[nums.length]; //構(gòu)造差分?jǐn)?shù)組 diff[0]=nums[0]; for(inti=1;i

通過(guò)這個(gè)diff差分?jǐn)?shù)組是可以反推出原始數(shù)組nums的,代碼邏輯如下:

int[]res=newint[diff.length]; //根據(jù)差分?jǐn)?shù)組構(gòu)造結(jié)果數(shù)組 res[0]=diff[0]; for(inti=1;i

這樣構(gòu)造差分?jǐn)?shù)組diff,就可以快速進(jìn)行區(qū)間增減的操作,如果你想對(duì)區(qū)間nums[i..j]的元素全部加 3,那么只需要讓diff[i] += 3,然后再讓diff[j+1] -= 3即可:

原理很簡(jiǎn)單,回想diff數(shù)組反推nums數(shù)組的過(guò)程,diff[i] += 3意味著給nums[i..]所有的元素都加了 3,然后diff[j+1] -= 3又意味著對(duì)于nums[j+1..]所有元素再減 3,那綜合起來(lái),是不是就是對(duì)nums[i..j]中的所有元素都加 3 了?

只要花費(fèi) O(1) 的時(shí)間修改diff數(shù)組,就相當(dāng)于給nums的整個(gè)區(qū)間做了修改。多次修改diff,然后通過(guò)diff數(shù)組反推,即可得到nums修改后的結(jié)果。

現(xiàn)在我們把差分?jǐn)?shù)組抽象成一個(gè)類,包含increment方法和result方法:

classDifference{ //差分?jǐn)?shù)組 privateint[]diff; publicDifference(int[]nums){ assertnums.length>0; diff=newint[nums.length]; //構(gòu)造差分?jǐn)?shù)組 diff[0]=nums[0]; for(inti=1;i

這里注意一下increment方法中的 if 語(yǔ)句:

publicvoidincrement(inti,intj,intval){ diff[i]+=val; if(j+1

當(dāng)j+1 >= diff.length時(shí),說(shuō)明是對(duì)nums[i]及以后的整個(gè)數(shù)組都進(jìn)行修改,那么就不需要再給diff數(shù)組減val了。

算法實(shí)踐

這里看一下力扣第 1109 題「航班預(yù)訂統(tǒng)計(jì)」:

函數(shù)簽名如下:

int[]corpFlightBookings(int[][]bookings,intn)

這個(gè)題目就在那繞彎彎,其實(shí)它就是個(gè)差分?jǐn)?shù)組的題,我給你翻譯一下:

給你輸入一個(gè)長(zhǎng)度為n的數(shù)組nums,其中所有元素都是 0。再給你輸入一個(gè)bookings,里面是若干三元組(i,j,k),每個(gè)三元組的含義就是要求你給nums數(shù)組的閉區(qū)間[i-1,j-1]中所有元素都加上k。請(qǐng)你返回最后的nums數(shù)組是多少?

PS:因?yàn)轭}目說(shuō)的n是從 1 開(kāi)始計(jì)數(shù)的,而數(shù)組索引從 0 開(kāi)始,所以對(duì)于輸入的三元組(i,j,k),數(shù)組區(qū)間應(yīng)該對(duì)應(yīng)[i-1,j-1]。

這么一看,不就是一道標(biāo)準(zhǔn)的差分?jǐn)?shù)組題嘛?我們可以直接復(fù)用剛才寫(xiě)的類:

int[]corpFlightBookings(int[][]bookings,intn){ //nums初始化為全0 int[]nums=newint[n]; //構(gòu)造差分解法 Differencedf=newDifference(nums); for(int[]booking:bookings){ //注意轉(zhuǎn)成數(shù)組索引要減一哦 inti=booking[0]-1; intj=booking[1]-1; intval=booking[2]; //對(duì)區(qū)間nums[i..j]增加val df.increment(i,j,val); } //返回最終的結(jié)果數(shù)組 returndf.result(); }

這道題就解決了。

其實(shí)我覺(jué)得差分?jǐn)?shù)組和前綴和數(shù)組都是比較常見(jiàn)且巧妙的算法技巧,分別適用不同的常見(jiàn),而且是會(huì)者不難,難者不會(huì)。所以,關(guān)于差分?jǐn)?shù)組的使用,你學(xué)會(huì)了嗎?!

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 算法
    +關(guān)注

    關(guān)注

    23

    文章

    4800

    瀏覽量

    98505
  • 差分
    +關(guān)注

    關(guān)注

    0

    文章

    65

    瀏覽量

    21997
  • 數(shù)組
    +關(guān)注

    關(guān)注

    1

    文章

    420

    瀏覽量

    27458

原文標(biāo)題:論那些小而美的算法技巧:差分?jǐn)?shù)組/前綴和

文章出處:【微信號(hào):TheAlgorithm,微信公眾號(hào):算法與數(shù)據(jù)結(jié)構(gòu)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    ADF4159:款13 GHz分?jǐn)?shù)N頻率合成器的詳細(xì)解析

    ADF4159:款13 GHz分?jǐn)?shù)N頻率合成器的詳細(xì)解析 在電子工程師的日常工作中,頻率合成器是個(gè)關(guān)鍵的組件,它能產(chǎn)生穩(wěn)定且精確的頻率信號(hào),廣泛應(yīng)用于雷達(dá)、通信等領(lǐng)域。今天,我們就
    的頭像 發(fā)表于 04-20 11:45 ?193次閱讀

    AD7609:高性能8通道分?jǐn)?shù)據(jù)采集系統(tǒng)的卓越之選

    AD7609:高性能8通道分?jǐn)?shù)據(jù)采集系統(tǒng)的卓越之選 在電子設(shè)計(jì)領(lǐng)域,數(shù)據(jù)采集系統(tǒng)(DAS)的性能直接影響著整個(gè)系統(tǒng)的精度和穩(wěn)定性。今天,我們來(lái)深入探討款備受關(guān)注的產(chǎn)品——AD7609,它是
    的頭像 發(fā)表于 03-31 10:45 ?120次閱讀

    嵌入式春招筆試高頻算法題(附解題思路)

    操作。 ? 題干 給定個(gè)整型數(shù)組arr[10] = {5,3,8,1,2,7,6,4,9,0},使用冒泡排序算法,將數(shù)組按升序排列,輸出排
    發(fā)表于 03-18 10:08

    單片機(jī)常用的14個(gè)C語(yǔ)言算法分享

    算法的描述:是對(duì)要解決個(gè)問(wèn)題或要完成項(xiàng)任務(wù)所采取的方法和步驟的描述,包括需要什么數(shù)據(jù)(輸入什么數(shù)據(jù)、輸出什么結(jié)果)、采用什么結(jié)構(gòu)、使用什么語(yǔ)句以及如何安排這些語(yǔ)句等。通常使用自然語(yǔ)
    發(fā)表于 01-29 06:59

    PID控制的算法

    !簡(jiǎn)單的不是原始的,簡(jiǎn)單的也不是落后的,簡(jiǎn)單到了美的程度。先看看PID算法般形式: PID的流程簡(jiǎn)單到了不能再簡(jiǎn)單的程度,通過(guò)誤差信號(hào)控制被控量,控制器本身就是比例、積分、微分三
    發(fā)表于 01-23 08:18

    C語(yǔ)言插入排序算法和代碼

    插入排序是排序算法種,它不改變?cè)械男蛄?數(shù)組),而是創(chuàng)建個(gè)新的序列,在新序列上進(jìn)行操作。   這里以從小到大排序?yàn)槔M(jìn)行講解。
    發(fā)表于 01-15 06:44

    深入解析SN65LBC182與SN75LBC182分總線收發(fā)器

    和SN75LBC182分?jǐn)?shù)據(jù)線收發(fā)器,看看它們有哪些出色的特性和應(yīng)用場(chǎng)景。 文件下載: sn65lbc182.pdf 、特性亮點(diǎn) 高連接能力 這兩款收發(fā)器的總線引腳具有高輸入電阻,相當(dāng)于四分之
    的頭像 發(fā)表于 12-31 09:20 ?539次閱讀

    數(shù)組的初體驗(yàn)

    程序中也需要容器,只不過(guò)該容器有點(diǎn)特殊,它在程序中是塊連續(xù)的,大小固定并且里面的數(shù)據(jù)類型致的內(nèi)存空間,它還有個(gè)好聽(tīng)的名字叫數(shù)組??梢詫?b class='flag-5'>數(shù)組
    發(fā)表于 11-25 08:06

    RC5算法協(xié)處理器設(shè)計(jì)實(shí)現(xiàn)

    1、RC5算法參數(shù)選擇 通過(guò)三個(gè)可變參數(shù)可確定組加密算法,可表示為RC5-w/r/b。w表示明文/秘文字分組后的字長(zhǎng),完整明文/秘文字長(zhǎng)為2w;w
    發(fā)表于 10-30 08:25

    SM4算法實(shí)現(xiàn)分享(算法原理

    。解密算法與加密算法采用同結(jié)構(gòu),只是輪密鑰使用的順序不同,加密采用順序的,解密采用逆序的。 SM4加密算法是典型的分組密碼
    發(fā)表于 10-30 08:10

    RISC-V 算法原理及串口通信

    具體方法 算法原理: 由于場(chǎng)景中的目標(biāo)在運(yùn)動(dòng),目標(biāo)的影像在不同圖像幀中的位置不同。該類算法對(duì)時(shí)間上連續(xù)的兩幀或三幀圖像進(jìn)行分運(yùn)算,不同幀對(duì)應(yīng)的像素點(diǎn)相減,判斷灰度的絕對(duì)值,當(dāng)絕
    發(fā)表于 10-28 06:16

    國(guó)密系列算法簡(jiǎn)介及SM4算法原理介紹

    保證,國(guó)產(chǎn)密碼算法實(shí)現(xiàn)了密碼算法的自主可控,對(duì)于保障我國(guó)的國(guó)家安全具有重要意義。目前,我國(guó)大力推廣國(guó)密算法的應(yīng)用,并涌現(xiàn)出系列國(guó)家商用密
    發(fā)表于 10-24 08:25

    DFT算法與FFT算法的優(yōu)劣分析

    概述 在諧波分析儀中,我們常常提到的兩個(gè)詞語(yǔ),就是DFT算法與FFT算法,那么款功率分析儀/諧波分析儀采用DFT
    的頭像 發(fā)表于 08-04 09:30 ?1747次閱讀

    50-600 MHz,12 dB 100 Ω 分?jǐn)?shù)字衰減器 skyworksinc

    電子發(fā)燒友網(wǎng)為你提供()50-600 MHz,12 dB 100 Ω 分?jǐn)?shù)字衰減器相關(guān)產(chǎn)品參數(shù)、數(shù)據(jù)手冊(cè),更有50-600 MHz,12 dB 100 Ω 分?jǐn)?shù)字衰減器的引腳圖、接
    發(fā)表于 05-23 18:33
    50-600 MHz,12 dB 100 Ω <b class='flag-5'>差</b><b class='flag-5'>分?jǐn)?shù)</b>字衰減器 skyworksinc

    50-600 MHz、6 dB 100 Ω 分?jǐn)?shù)字衰減器 skyworksinc

    電子發(fā)燒友網(wǎng)為你提供()50-600 MHz、6 dB 100 Ω 分?jǐn)?shù)字衰減器相關(guān)產(chǎn)品參數(shù)、數(shù)據(jù)手冊(cè),更有50-600 MHz、6 dB 100 Ω 分?jǐn)?shù)字衰減器的引腳圖、接線圖
    發(fā)表于 05-23 18:32
    50-600 MHz、6 dB 100 Ω <b class='flag-5'>差</b><b class='flag-5'>分?jǐn)?shù)</b>字衰減器 skyworksinc