在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

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

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

算法與數(shù)據(jù)結(jié)構(gòu) ? 來(lái)源:吳師兄學(xué)算法 ? 作者:吳師兄學(xué)算法 ? 2022-08-02 14:17 ? 次閱讀
大家好,我是吳師兄,

今天的題目來(lái)源于 LeetCode 第 560 號(hào)問(wèn)題:和為 K 的子數(shù)組,難度為「中等」。

一、題目描述

給你一個(gè)整數(shù)數(shù)組nums和一個(gè)整數(shù)k,請(qǐng)你統(tǒng)計(jì)并返回該數(shù)組中和為k的子數(shù)組的個(gè)數(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

二、題目解析

補(bǔ)充知識(shí)點(diǎn)前綴和:前綴和指一個(gè)數(shù)組的某下標(biāo)之前的所有數(shù)組元素的和(包含其自身)。

利用前綴和這種特點(diǎn),可以快速的計(jì)算某個(gè)區(qū)間內(nèi)的和,比如前 i 個(gè)元素的前綴和為preSum[i] = num[0] + nums[1] + ... + nums[i],而前 j 個(gè)元素的前綴和為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

題目這個(gè)時(shí)候就變成了需要尋找出多少個(gè) i 和 j 的組合,使得 [ i , j ] 這個(gè)區(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;
}
}

在計(jì)算過(guò)程中,有兩個(gè) for 循環(huán)發(fā)生了嵌套,時(shí)間復(fù)雜度來(lái)到了 O(n^2) 級(jí)別。

需要優(yōu)化。

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

具體操作如下:

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

2、開(kāi)始從頭到尾遍歷 nums 數(shù)組,在遍歷過(guò)程中,會(huì)執(zhí)行兩個(gè)操作。

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

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

4、判斷之前有沒(méi)有存儲(chǔ) pre - k 這種前綴和,如果有,說(shuō)明 pre - k 到 pre 直接的那些元素值之和就是 k。

5、返回結(jié)果。

三、參考代碼

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)計(jì)和為K的子數(shù)組的數(shù)量
intcount=0;

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

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

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

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

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

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

}

//這個(gè)值出現(xiàn)的頻次存儲(chǔ)到mp中
// getOrDefault:當(dāng) Map 集合中有這個(gè) key 時(shí),就使用這個(gè) key 對(duì)應(yīng)的 value 值
//如果沒(méi)有就使用默認(rèn)值defaultValue
mp.put(pre,mp.getOrDefault(pre,0)+1);
}

//返回結(jié)果
returncount;
}
}

2、C++ 代碼

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

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

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

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

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

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

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

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

}

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

//返回結(jié)果
returncount;

}
};

3、Python 代碼

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

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

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

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

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

#存儲(chǔ)索引為i的這個(gè)元素時(shí),前綴和的值是多少
pre+=nums[i]

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

#這個(gè)值出現(xiàn)的頻次存儲(chǔ)到mp中
# getOrDefault:當(dāng) Map 集合中有這個(gè) key 時(shí),就使用這個(gè) key 對(duì)應(yīng)的 value 值
#如果沒(méi)有就使用默認(rèn)值defaultValue
mp[pre]+=1

#返回結(jié)果
returncount

四、復(fù)雜度分析

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

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

審核編輯 :李倩


聲明:本文內(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)投訴
  • 數(shù)組
    +關(guān)注

    關(guān)注

    1

    文章

    417

    瀏覽量

    25947
  • leetcode
    +關(guān)注

    關(guān)注

    0

    文章

    20

    瀏覽量

    2328

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

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    FMC卡設(shè)計(jì)方案:202-基于TI DSP TMS320C6678、Xilinx K7 FPGA XC7K325T的高速數(shù)據(jù)處理核心板

    AD FMC卡 , FMC卡 , FMC卡模塊 , XC7K420T處理板 , 圖像FMC
    的頭像 發(fā)表于 12-16 16:02 ?156次閱讀
    FMC<b class='flag-5'>子</b>卡設(shè)計(jì)方案:202-基于TI DSP TMS320C6678、Xilinx <b class='flag-5'>K</b>7 FPGA XC7<b class='flag-5'>K</b>325T的高速數(shù)據(jù)處理核心板

    TPSM560R6HEVM使用手冊(cè)

    電子發(fā)燒友網(wǎng)站提供《TPSM560R6HEVM使用手冊(cè).pdf》資料免費(fèi)下載
    發(fā)表于 12-03 15:46 ?0次下載
    TPSM<b class='flag-5'>560</b>R6HEVM使用手冊(cè)

    使用TPSM560R6EVM

    電子發(fā)燒友網(wǎng)站提供《使用TPSM560R6EVM.pdf》資料免費(fèi)下載
    發(fā)表于 11-28 15:00 ?0次下載
    使用TPSM<b class='flag-5'>560</b>R6EVM

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

    指針數(shù)組和二維數(shù)組有沒(méi)有區(qū)別?比如這樣的兩個(gè)代碼。 int main(){ char *s1[] = { "hello", "world", "total" }; char s2[][6
    的頭像 發(fā)表于 11-24 11:12 ?152次閱讀

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

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

    DS560MB410EVM用戶指南

    電子發(fā)燒友網(wǎng)站提供《DS560MB410EVM用戶指南.pdf》資料免費(fèi)下載
    發(fā)表于 11-15 15:27 ?0次下載
    DS<b class='flag-5'>560</b>MB410EVM用戶指南

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

    在LabVIEW中,將字符串數(shù)組轉(zhuǎn)換為數(shù)值數(shù)組是一項(xiàng)常見(jiàn)的任務(wù),尤其是在處理數(shù)據(jù)采集、信號(hào)處理或用戶輸入時(shí)。 1. 理解LabVIEW的數(shù)據(jù)類型 在開(kāi)始之前,了解LabVIEW中的數(shù)據(jù)類型是非
    的頭像 發(fā)表于 09-04 17:47 ?2349次閱讀

    使用stm32l451片,對(duì)ad7606進(jìn)行3通道100k采樣值跳動(dòng)問(wèn)題?

    本人使用的是stm32l451片,對(duì)ad7606進(jìn)行3通道100k采樣,采5000個(gè)點(diǎn),硬件spi速度10m,主頻80m,出來(lái)的數(shù)據(jù)fft計(jì)算之后的電流值不停地在跳動(dòng),請(qǐng)問(wèn)是什么問(wèn)題,采樣部分用的是ll庫(kù)函數(shù),請(qǐng)大佬指點(diǎn)一下
    發(fā)表于 08-19 10:04

    面試???1:函數(shù)指針與指針函數(shù)、數(shù)組指針與指針數(shù)組

    在嵌入式開(kāi)發(fā)領(lǐng)域,函數(shù)指針、指針函數(shù)、數(shù)組指針和指針數(shù)組是一些非常重要但又容易混淆的概念。理解它們的特性和應(yīng)用場(chǎng)景,對(duì)于提升嵌入式程序的效率和質(zhì)量至關(guān)重要。一、指針函數(shù)與函數(shù)指針指針函數(shù):定義:指針
    的頭像 發(fā)表于 08-10 08:11 ?861次閱讀
    面試???1:函數(shù)指針與指針函數(shù)、<b class='flag-5'>數(shù)組</b>指針與指針<b class='flag-5'>數(shù)組</b>

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

    就是一個(gè)長(zhǎng)度0的數(shù)組,也就是說(shuō)不包含任何元素的數(shù)組。零長(zhǎng)度數(shù)組在C99標(biāo)準(zhǔn)中引入,并在C11中得到進(jìn)一步的支持。其定義很簡(jiǎn)單,就是一個(gè)大小
    的頭像 發(fā)表于 05-11 08:49 ?941次閱讀
    嵌入式中零長(zhǎng)度<b class='flag-5'>數(shù)組</b>基本操作方法

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

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

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

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

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

    數(shù)組和鏈表在內(nèi)存中的區(qū)別 數(shù)組和鏈表的優(yōu)缺點(diǎn)? 數(shù)組和鏈表是常見(jiàn)的數(shù)據(jù)結(jié)構(gòu),用于組織和存儲(chǔ)數(shù)據(jù)。它們?cè)趦?nèi)存中的存儲(chǔ)方式以及優(yōu)缺點(diǎn)方面存在一些顯著的差異。本文將詳細(xì)探討這些差異以及它們的優(yōu)缺點(diǎn)。 1.
    的頭像 發(fā)表于 02-21 11:30 ?1041次閱讀

    數(shù)組和鏈表有何區(qū)別

    數(shù)組和鏈表的區(qū)別,這個(gè)問(wèn)題,不僅面試中經(jīng)常遇到,考研的同學(xué)也得掌握才行。
    的頭像 發(fā)表于 02-19 15:33 ?512次閱讀
    <b class='flag-5'>數(shù)組</b>和鏈表有何區(qū)別

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

    PHP中數(shù)組的使用方法! PHP是一種廣泛使用的網(wǎng)絡(luò)編程語(yǔ)言,它的數(shù)組功能非常強(qiáng)大且靈活。數(shù)組是一種數(shù)據(jù)結(jié)構(gòu),它允許我們?cè)趩蝹€(gè)變量中存儲(chǔ)多個(gè)值。 在本篇文章中,我將詳細(xì)解釋PHP數(shù)組
    的頭像 發(fā)表于 01-12 15:11 ?551次閱讀
    主站蜘蛛池模板: 色天使视频| 欧美大片一区二区| 久久婷婷午色综合夜啪| 一级特黄aaa免费| 色综合天天综一个色天天综合网| 亚洲高清美女一区二区三区| 欧美巨大bbbb动漫| 亚洲天天做日日做天天欢毛片 | 韩国理论片2023现在观看| 免费黄视频网站| 免费一级毛片无毒不卡| 天天操天天干天天射| 日本不卡一区二区三区视频| 欧美一级乱理片免费观看| 天天做天天爱天天操| 午夜视频免费在线| 男人都懂的网址在线看片| 奇米4色| 国产在线麻豆自在拍91精品| 美女被拍拍拍拍拍拍拍拍| 欧美影院| 亚洲色图在线播放| yy6080一级毛片高清| ccav在线永久免费看| 人与牲动交xxxxbbbb高清| 手机看片国产免费现在观看| 久久狠狠干| 国产一级做a爰片久久毛片男 | 乱人伦的小说| 黄色一及毛片| 天天色天天综合网| 男女交性特一级| 国产三级日本三级美三级| 色射啪| 亚洲国产欧美精品一区二区三区 | 亚洲综合激情六月婷婷在线观看| 国产一区二区在线观看免费| 女人69xxx| 美女视频黄免费| 91福利免费视频| 香蕉视频一级|