色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

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

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

算法與數(shù)據(jù)結(jié)構(gòu) ? 來源:labuladong ? 作者:labuladong ? 2020-09-21 15:54 ? 次閱讀

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

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

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

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

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

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

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

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

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

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

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

這里就需要差分?jǐn)?shù)組的技巧,類似前綴和技巧構(gòu)造的prefix數(shù)組,我們先對nums數(shù)組構(gòu)造一個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

通過這個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ū)間增減的操作,如果你想對區(qū)間nums[i..j]的元素全部加 3,那么只需要讓diff[i] += 3,然后再讓diff[j+1] -= 3即可:

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

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

現(xiàn)在我們把差分?jǐn)?shù)組抽象成一個類,包含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 語句:

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

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

算法實踐

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

函數(shù)簽名如下:

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

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

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

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

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

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]; //對區(qū)間nums[i..j]增加val df.increment(i,j,val); } //返回最終的結(jié)果數(shù)組 returndf.result(); }

這道題就解決了。

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

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

    關(guān)注

    23

    文章

    4607

    瀏覽量

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

    關(guān)注

    0

    文章

    53

    瀏覽量

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

    關(guān)注

    1

    文章

    417

    瀏覽量

    25939

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

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

收藏 人收藏

    評論

    相關(guān)推薦

    數(shù)組的下標(biāo)為什么可以是負(fù)數(shù)

    最近有同學(xué)發(fā)來這樣段代碼,并提出問題,數(shù)組的下標(biāo)為什么可以是負(fù)數(shù)? ? ? #include int main(){ const char *s = "helloworld";
    的頭像 發(fā)表于 12-20 11:18 ?60次閱讀

    指針數(shù)組和二維數(shù)組有沒有區(qū)別

    。 首先是指針數(shù)組 s1。 s1 本身是數(shù)組數(shù)組有三元素,每個元素都是
    的頭像 發(fā)表于 11-24 11:12 ?139次閱讀

    C語言數(shù)組應(yīng)用計算機(jī)導(dǎo)論A第6講:數(shù)組

    C語言數(shù)組應(yīng)用計算機(jī)導(dǎo)論A第6講:數(shù)組
    發(fā)表于 11-20 15:33 ?0次下載

    labview字符串數(shù)組轉(zhuǎn)化為數(shù)值數(shù)組

    常重要的。LabVIEW支持多種數(shù)據(jù)類型,包括數(shù)值、字符串、數(shù)組、簇等。在本例中,我們將關(guān)注字符串數(shù)組和數(shù)值數(shù)組。 字符串數(shù)組 :由系列字
    的頭像 發(fā)表于 09-04 17:47 ?2254次閱讀

    為什么電勢計測量的是電池的電動勢不是其端電壓?

    電勢計是種精密的測量儀器,它能夠測量出電池的電動勢,不是其端電壓。
    的頭像 發(fā)表于 05-21 15:27 ?2326次閱讀

    .c文件中定義個數(shù)組遇到的疑問求解

    .c文件中定義個數(shù)組,然后在其他文件中引用,用sizeof求數(shù)組長度,那么按說是必須要聲明這個數(shù)
    發(fā)表于 05-14 07:03

    嵌入式中零長度數(shù)組基本操作方法

    就是長度為0的數(shù)組,也就是說不包含任何元素的數(shù)組。零長度數(shù)組在C99標(biāo)準(zhǔn)中引入,并在C11中得到進(jìn)
    的頭像 發(fā)表于 05-11 08:49 ?922次閱讀
    嵌入式中零長度<b class='flag-5'>數(shù)組</b>基本操作方法

    while的循環(huán)里面,怎么樣可以通過控件去讓其中的數(shù)組值全部初始化?

    這種方式是讓所有的數(shù)據(jù)都初始化了,我只需要部分?jǐn)?shù)據(jù)初始化,就是所有的數(shù)組,大佬們求幫助!
    發(fā)表于 04-18 21:19

    深入探索KUKA KRL中的數(shù)組應(yīng)用

    如果 CHAR 類型數(shù)組的所有數(shù)組元素都擁有相同的字符串,則不必單獨初始化每個數(shù)組元素。忽略右側(cè)的數(shù)組下標(biāo)。(對于
    的頭像 發(fā)表于 04-18 10:37 ?1229次閱讀
    深入探索KUKA KRL中的<b class='flag-5'>數(shù)組</b>應(yīng)用

    鴻蒙TypeScript入門學(xué)習(xí)第11天【Array(數(shù)組)】

    數(shù)組對象是使用單獨的變量名來存儲系列的值。 數(shù)組非常常用。
    的頭像 發(fā)表于 04-09 14:38 ?1134次閱讀
    鴻蒙TypeScript入門學(xué)習(xí)第11天【Array(<b class='flag-5'>數(shù)組</b>)】

    隨機(jī)抽取SV數(shù)組中的元素方法實現(xiàn)

    如果想從關(guān)聯(lián)數(shù)組中隨機(jī)選取元素,需要逐個訪問它之前的元素,原因是沒辦法能夠直接訪問到第N
    的頭像 發(fā)表于 03-21 10:11 ?980次閱讀
    隨機(jī)抽取SV<b class='flag-5'>數(shù)組</b>中的<b class='flag-5'>一</b><b class='flag-5'>個</b>元素方法實現(xiàn)

    數(shù)組和鏈表在內(nèi)存中的區(qū)別 數(shù)組和鏈表的優(yōu)缺點

    內(nèi)存中的存儲方式: 數(shù)組種連續(xù)存儲的數(shù)據(jù)結(jié)構(gòu),它將元素存儲在相鄰的內(nèi)存位置中。這使得數(shù)組的訪問效率高,可以通過下標(biāo)來直接訪問任何
    的頭像 發(fā)表于 02-21 11:30 ?1021次閱讀

    什么是分晶振 分晶振的優(yōu)勢 分輸出與單端輸出的差別

    許多優(yōu)勢,而其分輸出與單端輸出也有些明顯的區(qū)別。 首先,來了解分晶振的工作原理。分晶振結(jié)構(gòu)由兩
    的頭像 發(fā)表于 01-18 11:30 ?1142次閱讀

    PHP中數(shù)組的使用方法!

    如何創(chuàng)建數(shù)組、添加/刪除元素、訪問數(shù)組元素、遍歷數(shù)組以及使用數(shù)組方法和函數(shù)等等。 首先,我們來看下如何創(chuàng)建
    的頭像 發(fā)表于 01-12 15:11 ?540次閱讀

    labview怎么查數(shù)組中相同元素的個數(shù)

    要查找LabVIEW中數(shù)組中相同元素的個數(shù),可以使用以下步驟: 創(chuàng)建包含要查找的數(shù)值的數(shù)組。這可以通過手動輸入數(shù)組元素或從文件/其他數(shù)據(jù)
    的頭像 發(fā)表于 12-28 16:42 ?3485次閱讀
    主站蜘蛛池模板: 69式国产真人免费视频| jyzzjyzzz视频国产在线观看| 亚洲精品91| 国产免费内射又粗又爽密桃视频 | 久久综合视频网站| 亚洲精品高清AV在线播放| 亚洲精品第一页| h版动漫在线播放的网站| 美女露出乳胸扒开尿口| 国产永久视频| 欧美506070| yellow日本动漫免费观看| 欧美日韩精品一区二区三区四区| 1788福利视频在视频线| 美女脱内衣裸身尿口露出来| 3D动漫网站HOXXXxes| 两个奶头被吃得又翘又痛| 一二三四韩国免费观看| 久久国产视频网站| 色哟哟tv| 国产成人精品精品欧美| 天美传媒 免费观看| 国产婷婷综合在线视频中文| 亚洲精品无码午夜福利在线观看| 精品人妻一区二区三区视频53| 一个人日本的视频免费完整版| 在线视频久久只有精品第一日韩| 国产在线亚洲v天堂a| 在线播放成人无码日| 欧美亚洲精品午夜福利AV| www亚洲欲色成人久久精品| 色偷偷成人网免费视频男人的天堂| 国产精品无码AV天天爽色欲| 亚洲精品无码久久久久A片 | 果冻传媒在线观看高清完整免费| 日韩免费精品视频| 99精品免费观看| 手机在线免费| 久久精品亚洲视频| 成人区在线观看免费视频| 亚洲精品tv久久久久久久久久|