国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

一個小而美的算法技巧:差分數組

算法與數據結構 ? 來源:labuladong ? 作者:labuladong ? 2020-09-21 15:54 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

本文給大家介紹一個小而美的算法技巧:差分數組。

讀完本文,你可以去解決力扣第 1109 題「航班預訂統計」,難度Medium

差分數組技巧是前文前綴和技巧詳解寫過的前綴和技巧的兄弟。

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

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

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

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

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

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

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

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

這里就需要差分數組的技巧,類似前綴和技巧構造的prefix數組,我們先對nums數組構造一個diff差分數組,diff[i]就是nums[i]和nums[i-1]之差:

int[]diff=newint[nums.length]; //構造差分數組 diff[0]=nums[0]; for(inti=1;i

通過這個diff差分數組是可以反推出原始數組nums的,代碼邏輯如下:

int[]res=newint[diff.length]; //根據差分數組構造結果數組 res[0]=diff[0]; for(inti=1;i

這樣構造差分數組diff,就可以快速進行區間增減的操作,如果你想對區間nums[i..j]的元素全部加 3,那么只需要讓diff[i] += 3,然后再讓diff[j+1] -= 3即可:

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

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

現在我們把差分數組抽象成一個類,包含increment方法和result方法:

classDifference{ //差分數組 privateint[]diff; publicDifference(int[]nums){ assertnums.length>0; diff=newint[nums.length]; //構造差分數組 diff[0]=nums[0]; for(inti=1;i

這里注意一下increment方法中的 if 語句:

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

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

算法實踐

這里看一下力扣第 1109 題「航班預訂統計」:

函數簽名如下:

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

這個題目就在那繞彎彎,其實它就是個差分數組的題,我給你翻譯一下:

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

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

這么一看,不就是一道標準的差分數組題嘛?我們可以直接復用剛才寫的類:

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

這道題就解決了。

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

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 算法
    +關注

    關注

    23

    文章

    4784

    瀏覽量

    98060
  • 差分
    +關注

    關注

    0

    文章

    65

    瀏覽量

    21970
  • 數組
    +關注

    關注

    1

    文章

    420

    瀏覽量

    27362

原文標題:論那些小而美的算法技巧:差分數組/前綴和

文章出處:【微信號:TheAlgorithm,微信公眾號:算法與數據結構】歡迎添加關注!文章轉載請注明出處。

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    單片機常用的14C語言算法分享

    算法的描述:是對要解決問題或要完成項任務所采取的方法和步驟的描述,包括需要什么數據(輸入什么數據、輸出什么結果)、采用什么結構、使用什么語句以及如何安排這些語句等。通常使用自然語
    發表于 01-29 06:59

    PID控制的算法

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

    C語言插入排序算法和代碼

    插入排序是排序算法種,它不改變原有的序列(數組),而是創建新的序列,在新序列上進行操作。   這里以從小到大排序為例進行講解。
    發表于 01-15 06:44

    深入解析SN65LBC182與SN75LBC182分總線收發器

    和SN75LBC182分數據線收發器,看看它們有哪些出色的特性和應用場景。 文件下載: sn65lbc182.pdf 、特性亮點 高連接能力 這兩款收發器的總線引腳具有高輸入電阻,相當于四分之
    的頭像 發表于 12-31 09:20 ?303次閱讀

    數組的初體驗

    程序中也需要容器,只不過該容器有點特殊,它在程序中是塊連續的,大小固定并且里面的數據類型致的內存空間,它還有好聽的名字叫數組。可以將數組
    發表于 11-25 08:06

    二維數組介紹

    ] = { {1, 2,3}, {4, 5,6},{7, 8, 9}};array[1][1] = 5; 或許你以為在內存中 array 數組會像二維矩陣: 123456789 可實際上它是這樣
    發表于 11-25 07:42

    RC5算法協處理器設計實現

    1、RC5算法參數選擇 通過三可變參數可確定組加密算法,可表示為RC5-w/r/b。w表示明文/秘文字分組后的字長,完整明文/秘文字長為2w;w
    發表于 10-30 08:25

    SM4算法實現分享(算法原理

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

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

    具體方法 算法原理: 由于場景中的目標在運動,目標的影像在不同圖像幀中的位置不同。該類算法對時間上連續的兩幀或三幀圖像進行分運算,不同幀對應的像素點相減,判斷灰度的絕對值,當絕
    發表于 10-28 06:16

    國密系列算法簡介及SM4算法原理介紹

    保證,國產密碼算法實現了密碼算法的自主可控,對于保障我國的國家安全具有重要意義。目前,我國大力推廣國密算法的應用,并涌現出系列國家商用密
    發表于 10-24 08:25

    DFT算法與FFT算法的優劣分析

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

    50-600 MHz,12 dB 100 Ω 分數字衰減器 skyworksinc

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

    50-600 MHz、6 dB 100 Ω 分數字衰減器 skyworksinc

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

    種基于分數階 PID 直流電機調速的 AGV 控制系統

    電傳感器實現避障,并采用上位機對其進行監控。為達到 AGV 電機調速的穩定性與實時性,采用分數階 PID 算法進行控制,通過 Matlab軟件進行建模與仿真,驗證其可行性。最后,經實際應用場合驗證,AGV 小車具有抗干擾能力強,避障精度高,運行穩定安全等優點。 純分享貼,
    發表于 03-25 15:10

    美的人形機器人曝光,已具備打螺絲能力?

    電子發燒友網綜合報道:2025 年 3 月 18 日,美的集團首次公開展示了其人形機器人樣機。該產品集成了機械、傳感、智能算法等多項前沿技術,這亮相標志著美的在人形機器人領域取得了實
    發表于 03-20 01:08 ?1265次閱讀
    <b class='flag-5'>美的</b>人形機器人曝光,已具備打螺絲能力?