91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

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

LeetCode 560:和為K的子數(shù)組

算法與數(shù)據(jù)結構 ? 來源:吳師兄學算法 ? 作者:吳師兄學算法 ? 2022-08-02 14:17 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

大家好,我是吳師兄,

今天的題目來源于 LeetCode 第 560 號問題:和為 K 的子數(shù)組,難度為「中等」。

一、題目描述

給你一個整數(shù)數(shù)組nums和一個整數(shù)k,請你統(tǒng)計并返回該數(shù)組中和為k的子數(shù)組的個數(shù)。

示例 1:

輸入:nums =[1,1,1], k = 2
輸出:2

示例 2:

輸入:nums =[1,2,3], k = 3
輸出:2

提示:

  • 1 <= nums.length <= 2 * 10^4
  • -1000 <= nums[i] <= 1000
  • -10^7 <= k <= 10^7

二、題目解析

補充知識點前綴和:前綴和指一個數(shù)組的某下標之前的所有數(shù)組元素的和(包含其自身)。

利用前綴和這種特點,可以快速的計算某個區(qū)間內(nèi)的和,比如前 i 個元素的前綴和為preSum[i] = num[0] + nums[1] + ... + nums[i],而前 j 個元素的前綴和為preSum[j] = num[0] + nums[1] + ... + nums[j]。

那么區(qū)間[ i , j ]之間的子數(shù)組之和就是 **preSum[j] - preSum[i]**。

81fa901c-1217-11ed-ba43-dac502259ad0.png

基于這種思路,可以先遍歷一次數(shù)組,求出前綴和數(shù)組。

82155be0-1217-11ed-ba43-dac502259ad0.png

題目這個時候就變成了需要尋找出多少個 i 和 j 的組合,使得 [ i , j ] 這個區(qū)間的和為 k

classSolution{
publicintsubarraySum(int[]nums,intk){

intlen=nums.length;

int[]preSum=newint[len+1];

preSum[0]=0;

for(inti=0;i1]=preSum[i]+nums[i];
}

intcount=0;

for(inti=0;ifor(intj=i;jif(preSum[j+1]-preSum[i]==k){
count++;
}
}
}
returncount;
}
}

在計算過程中,有兩個 for 循環(huán)發(fā)生了嵌套,時間復雜度來到了 O(n^2) 級別。

需要優(yōu)化。

事實上,我們不需要去計算出具體是哪兩項的前綴和之差等于k,只需要知道等于 k 的前綴和之差出現(xiàn)的次數(shù) count,所以我們可以在遍歷數(shù)組過程中,先去計算以 nums[i] 結尾的前綴和 pre,然后再去判斷之前有沒有存儲 pre - k 這種前綴和,如果有,那么 pre - k 到 pre 這中間的元素和就是 k 了。

具體操作如下:

1、利用哈希表,以前綴和為鍵,出現(xiàn)次數(shù)為對應的值,記錄 pre[i] 出現(xiàn)的次數(shù)。

2、開始從頭到尾遍歷 nums 數(shù)組,在遍歷過程中,會執(zhí)行兩個操作。

3、存儲索引為 i 的這個元素時,前綴和的值是多少,并且把這個值出現(xiàn)的頻次存儲到 mp 中。

823da2e4-1217-11ed-ba43-dac502259ad0.png

4、判斷之前有沒有存儲 pre - k 這種前綴和,如果有,說明 pre - k 到 pre 直接的那些元素值之和就是 k。

5、返回結果。

三、參考代碼

1、Java 代碼

//登錄AlgoMooc官網(wǎng)獲取更多算法圖解
//https://www.algomooc.com
//作者:程序員吳師兄
//代碼有看不懂的地方一定要私聊咨詢吳師兄呀
//和為 K 的子數(shù)組(LeetCode 560):https://leetcode.cn/problems/subarray-sum-equals-k/
classSolution{
publicintsubarraySum(int[]nums,intk){

//統(tǒng)計和為K的子數(shù)組的數(shù)量
intcount=0;

//記錄遍歷到索引為i的這個元素時,前綴和的值是多少
intpre=0;

//利用哈希表,以前綴和為鍵,出現(xiàn)次數(shù)為對應的值,記錄pre[i]出現(xiàn)的次數(shù)
HashMapmp=newHashMap<>();

//一開始,需要設置前綴和為0時,出現(xiàn)的次數(shù)為1次
//這一行的作用就是為了應對nums[0]+nums[1]+...+nums[i]==k這種情況
//如數(shù)組[1,2,3,6]
//這個數(shù)組的累加和數(shù)組為[1,3,【6】,12]
//如果k=6,假如mp中沒有預先存儲(0,1)
//那么來到累加和為6的位置時,這時mp中存儲的就只有兩個數(shù)據(jù)(1,1),(3,1)
//想去判斷mp.containsKey(pre-k),這時pre-k=6-6=0
//但map中沒有(0,1),
//因為這個時候忽略了從下標0累加到下標i等于k的情況
//僅僅是統(tǒng)計了從下標大于0到某個位置等于k的所有答案
mp.put(0,1);

//開始從頭到尾遍歷nums數(shù)組,在遍歷過程中,會執(zhí)行兩個操作
//1、存儲索引為i的這個元素時,前綴和的值是多少,并且把這個值出現(xiàn)的頻次存儲到mp中
//2、判斷之前有沒有存儲pre-k這種前綴和,如果有,說明pre-k到pre直接的那些元素值之和就是k
for(inti=0;i//存儲索引為i的這個元素時,前綴和的值是多少
pre+=nums[i];

//判斷之前有沒有存儲pre-k這種前綴和
if(mp.containsKey(pre-k)){

//如果有,說明pre-k到pre直接的那些元素值之和就是k
//找到了一組,累加到count上
count+=mp.get(pre-k);

}

//這個值出現(xiàn)的頻次存儲到mp中
// getOrDefault:當 Map 集合中有這個 key 時,就使用這個 key 對應的 value 值
//如果沒有就使用默認值defaultValue
mp.put(pre,mp.getOrDefault(pre,0)+1);
}

//返回結果
returncount;
}
}

2、C++ 代碼

classSolution{
public:
intsubarraySum(vector<int>&nums,intk){

//統(tǒng)計和為K的子數(shù)組的數(shù)量
intcount=0;

//記錄遍歷到索引為i的這個元素時,前綴和的值是多少
intpre=0;

//利用哈希表,以前綴和為鍵,出現(xiàn)次數(shù)為對應的值,記錄pre[i]出現(xiàn)的次數(shù)
unordered_map<int,int>mp;

//一開始,需要設置前綴和為0時,出現(xiàn)的次數(shù)為1次
//這一行的作用就是為了應對nums[0]+nums[1]+...+nums[i]==k這種情況
//如數(shù)組[1,2,3,6]
//這個數(shù)組的累加和數(shù)組為[1,3,【6】,12]
//如果k=6,假如mp中沒有預先存儲(0,1)
//那么來到累加和為6的位置時,這時mp中存儲的就只有兩個數(shù)據(jù)(1,1),(3,1)
//想去判斷mp.containsKey(pre-k),這時pre-k=6-6=0
//但map中沒有(0,1),
//因為這個時候忽略了從下標0累加到下標i等于k的情況
//僅僅是統(tǒng)計了從下標大于0到某個位置等于k的所有答案
mp[0]=1;

//開始從頭到尾遍歷nums數(shù)組,在遍歷過程中,會執(zhí)行兩個操作
//1、存儲索引為i的這個元素時,前綴和的值是多少,并且把這個值出現(xiàn)的頻次存儲到mp中
//2、判斷之前有沒有存儲pre-k這種前綴和,如果有,說明pre-k到pre直接的那些元素值之和就是k
for(inti=0;i//存儲索引為i的這個元素時,前綴和的值是多少
pre+=nums[i];

//判斷之前有沒有存儲pre-k這種前綴和
if(mp.find(pre-k)!=mp.end()){

//如果有,說明pre-k到pre直接的那些元素值之和就是k
//找到了一組,累加到count上
count+=mp[pre-k];

}

//這個值出現(xiàn)的頻次存儲到mp中
mp[pre]++;
}

//返回結果
returncount;

}
};

3、Python 代碼

classSolution:
defsubarraySum(self,nums:List[int],k:int)->int:
#統(tǒng)計和為K的子數(shù)組的數(shù)量
count=0

#記錄遍歷到索引為i的這個元素時,前綴和的值是多少
pre=0

#利用哈希表,以前綴和為鍵,出現(xiàn)次數(shù)為對應的值,記錄pre[i]出現(xiàn)的次數(shù)
mp=collections.defaultdict(int)

#一開始,需要設置前綴和為0時,出現(xiàn)的次數(shù)為1次
#這一行的作用就是為了應對nums[0]+nums[1]+...+nums[i]==k這種情況
#如數(shù)組[1,2,3,6]
#這個數(shù)組的累加和數(shù)組為[1,3,【6】,12]
#如果k=6,假如mp中沒有預先存儲(0,1)
#那么來到累加和為6的位置時,這時mp中存儲的就只有兩個數(shù)據(jù)(1,1),(3,1)
#想去判斷mp.containsKey(pre-k),這時pre-k=6-6=0
#但map中沒有(0,1),
#因為這個時候忽略了從下標0累加到下標i等于k的情況
#僅僅是統(tǒng)計了從下標大于0到某個位置等于k的所有答案
mp[0]=1

#開始從頭到尾遍歷nums數(shù)組,在遍歷過程中,會執(zhí)行兩個操作
#1、存儲索引為i的這個元素時,前綴和的值是多少,并且把這個值出現(xiàn)的頻次存儲到mp中
#2、判斷之前有沒有存儲pre-k這種前綴和,如果有,說明pre-k到pre直接的那些元素值之和就是k
foriinrange(len(nums)):

#存儲索引為i的這個元素時,前綴和的值是多少
pre+=nums[i]

#判斷之前有沒有存儲pre-k這種前綴和
#如果有,說明pre-k到pre直接的那些元素值之和就是k
#找到了一組,累加到count上
#利用defaultdict的特性,當presum-k不存在時,返回的是0
count+=mp[pre-k]

#這個值出現(xiàn)的頻次存儲到mp中
# getOrDefault:當 Map 集合中有這個 key 時,就使用這個 key 對應的 value 值
#如果沒有就使用默認值defaultValue
mp[pre]+=1

#返回結果
returncount

四、復雜度分析

時間復雜度:O(n),其中 n 為數(shù)組的長度。我們遍歷數(shù)組的時間復雜度為 O(n),中間利用哈希表查詢刪除的復雜度均為 O(1),因此總時間復雜度為 O(n)。

空間復雜度:O(n),其中 n 為數(shù)組的長度。哈希表在最壞情況下可能有 n 個不同的鍵值,因此需要 O(n) 的空間復雜度。

審核編輯 :李倩


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

    關注

    1

    文章

    420

    瀏覽量

    27351
  • leetcode
    +關注

    關注

    0

    文章

    20

    瀏覽量

    2542

原文標題:LeetCode 560:和為 K 的子數(shù)組

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

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    德州儀器TPSM560R6H電源模塊深度解析

    德州儀器TPSM560R6H電源模塊深度解析 在電子設計領域,電源模塊的性能直接關系到整個系統(tǒng)的穩(wěn)定性和可靠性。德州儀器(TI)的TPSM560R6H電源模塊憑借其卓越的特性和廣泛的應用場景,成為
    的頭像 發(fā)表于 03-03 14:50 ?46次閱讀

    NXP K51 系列微控制器:助力電子創(chuàng)新的多功能利器

    ,它以豐富的特性和出色的性能,各類應用提供了強大的支持。本文將深入剖析 K51 系列微控制器的技術特點、關鍵參數(shù)及應用場景,幫助電子工程師更好地了解和應用這款產(chǎn)品。 文件下載: MK51DX256CMC10.pdf 產(chǎn)品概述
    的頭像 發(fā)表于 02-28 15:35 ?104次閱讀

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

    ] (最初狀態(tài),將第1個元素分為排序好的數(shù)組,其余待插入元素)   [ 3 ] [ 2 4 1 ] (由于3>2,所以待插入位置j=1)   [ 2 3 ] [ 4 1 ] (將2插入
    發(fā)表于 01-15 06:44

    DS560DF810:56Gbps 多速率 8 通道重定時器的卓越之選

    DS560DF810:56Gbps 多速率 8 通道重定時器的卓越之選 在高速串行數(shù)據(jù)傳輸領域,DS560DF810 這款具有交叉點的 56Gbps 多速率 8 通道重定時器備受關注。今天,我們就來
    的頭像 發(fā)表于 12-16 11:15 ?401次閱讀

    高性能溝槽式肖特基整流器NRVTS560ETFS系列解析

    在電子設備設計中,整流器是不可或缺的元件,它的性能直接影響到整個系統(tǒng)的效率和穩(wěn)定性。今天我們要探討的是安森美(ON Semiconductor)推出的NRVTS560ETFS、NRVTS560ETFSWF這兩款溝槽式肖特基整流器,它們在諸多方面展現(xiàn)出了卓越的性能。
    的頭像 發(fā)表于 12-01 15:01 ?438次閱讀
    高性能溝槽式肖特基整流器NRVTS<b class='flag-5'>560</b>ETFS系列解析

    數(shù)組的初體驗

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

    DS560DF810EVM評估模塊技術解析與應用指南

    Texas Instruments DS560DF810EVM評估模塊設計用于評估DS560DF810重定時器的高速和低速功能。DS560DF810重定時器是一款具有集成信號調(diào)理功能的八通道多速率重
    的頭像 發(fā)表于 09-01 16:04 ?1015次閱讀
    DS<b class='flag-5'>560</b>DF810EVM評估模塊技術解析與應用指南

    DS560MB410EVM重定時器評估模塊技術解析

    Texas Instruments DS560MB410EVM重定時器評估板 (EVM) 是一款4通道線性轉(zhuǎn)接驅(qū)動器,可擴展高速串行鏈路的覆蓋范圍并提升穩(wěn)定性,適用于高達56Gbps PAM4接口
    的頭像 發(fā)表于 09-01 14:47 ?896次閱讀
    DS<b class='flag-5'>560</b>MB410EVM重定時器評估模塊技術解析

    DS560DF810 56Gbps八通道重定時器技術深度解析

    。DS560DF810中的每個通道均可獨立鎖定19.6GBd至28.9GBd連續(xù)范圍內(nèi)的符號速率(PAM4和NRZ),或任何支持的速率。集成的CDR功能可重置抖動預算并重定時高速串行數(shù)據(jù),是前端口光學模塊
    的頭像 發(fā)表于 08-29 15:41 ?912次閱讀
    DS<b class='flag-5'>560</b>DF810 56Gbps八通道重定時器技術深度解析

    DS560DF410四通道多速率重定時器技術解析

    通道均可獨立鎖定到符號速率(PAM4和NRZ),連續(xù)范圍19.6至28.9GBd或任何支持的速率。集成的CDR功能可重置抖動預算并重定時高速串行數(shù)據(jù),是前端口光學模塊應用的理想選擇。這些特性可實現(xiàn)
    的頭像 發(fā)表于 08-27 09:13 ?875次閱讀
    DS<b class='flag-5'>560</b>DF410四通道多速率重定時器技術解析

    DS560DF410EVM重定時器評估模塊技術解析與應用指南

    Texas Instruments DS560DF410EVM重定時器評估模塊 (EVM) 允許用戶快速評估DS560DF410重定時器的高速和低速功能。DS560DF410是一款集成了信號調(diào)理功能
    的頭像 發(fā)表于 08-26 15:56 ?1000次閱讀
    DS<b class='flag-5'>560</b>DF410EVM重定時器評估模塊技術解析與應用指南

    HT560音頻設備注入強勁動力的高效功率放大器

    的功能和穩(wěn)定的性能,成為眾多音頻設備設計的優(yōu)質(zhì)之選。 ? ? ? HT560 在功率輸出上展現(xiàn)出強大的靈活性,能通過不同模式滿足多樣化需求。在 BTL 模式下,當處于 24V 電壓、8Ω 負載的工況時,可穩(wěn) 定提供 2×30W 的連續(xù)功率輸出;若供電電壓 16V、負載
    的頭像 發(fā)表于 08-15 15:33 ?802次閱讀
    HT<b class='flag-5'>560</b>:<b class='flag-5'>為</b>音頻設備注入強勁動力的高效功率放大器

    CD560直流電能表:精準計量,助力全球充電樁市場高效發(fā)展

    樁的計量要求,更符合國際標準(如IEC 62053-41:2021),充電樁運營提供可靠的計費依據(jù),有效減少計費爭議。 國際認證:全球市場準入保障 CD560系列通過了CE、UL等多項國際權威認證,確保產(chǎn)品在全球范圍內(nèi)的合規(guī)性和適用性。特別是針對北美市場,CD
    的頭像 發(fā)表于 05-06 17:18 ?579次閱讀
    CD<b class='flag-5'>560</b>直流電能表:精準計量,助力全球充電樁市場高效發(fā)展

    HT560立體聲D類音頻功放技術手冊

    ? ? ? HT560是一顆I2S輸入的立體聲D類音頻功放,支持多種采樣頻率,包含兩種速率模式。? ? ? HT560除了驅(qū)動BTL立體聲雙喇叭外,還能驅(qū)動PBTL單喇叭。? ? ? HT560包含
    發(fā)表于 04-11 17:30 ?4次下載

    高壓絕緣的絕緣電阻及耐壓試驗運用及方法

    絕緣是電網(wǎng)中大量使用的一種絕緣部件,當前應用得最廣泛的是瓷質(zhì)絕緣,也有少量的玻璃絕緣,有機(或復合材料)絕緣國內(nèi)也陸續(xù)有了應用。絕緣
    的頭像 發(fā)表于 04-11 15:35 ?1937次閱讀
    高壓絕緣<b class='flag-5'>子</b>的絕緣電阻及耐壓試驗運用及方法