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

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

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

3天內不再提示

LeetCode 560:和為K的子數組

算法與數據結構 ? 來源:吳師兄學算法 ? 作者:吳師兄學算法 ? 2022-08-02 14:17 ? 次閱讀
大家好,我是吳師兄,

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

一、題目描述

給你一個整數數組nums和一個整數k,請你統計并返回該數組中和為k的子數組的個數

示例 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

二、題目解析

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

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

那么區間[ i , j ]之間的子數組之和就是 **preSum[j] - preSum[i]**。

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

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

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

題目這個時候就變成了需要尋找出多少個 i 和 j 的組合,使得 [ i , j ] 這個區間的和為 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 循環發生了嵌套,時間復雜度來到了 O(n^2) 級別。

需要優化

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

具體操作如下:

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

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

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

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

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

5、返回結果。

三、參考代碼

1、Java 代碼

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

//統計和為K的子數組的數量
intcount=0;

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

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

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

//開始從頭到尾遍歷nums數組,在遍歷過程中,會執行兩個操作
//1、存儲索引為i的這個元素時,前綴和的值是多少,并且把這個值出現的頻次存儲到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);

}

//這個值出現的頻次存儲到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){

//統計和為K的子數組的數量
intcount=0;

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

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

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

//開始從頭到尾遍歷nums數組,在遍歷過程中,會執行兩個操作
//1、存儲索引為i的這個元素時,前綴和的值是多少,并且把這個值出現的頻次存儲到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];

}

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

//返回結果
returncount;

}
};

3、Python 代碼

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

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

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

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

#開始從頭到尾遍歷nums數組,在遍歷過程中,會執行兩個操作
#1、存儲索引為i的這個元素時,前綴和的值是多少,并且把這個值出現的頻次存儲到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]

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

#返回結果
returncount

四、復雜度分析

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

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

審核編輯 :李倩


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

    關注

    1

    文章

    419

    瀏覽量

    26379
  • leetcode
    +關注

    關注

    0

    文章

    20

    瀏覽量

    2429

原文標題:LeetCode 560:和為 K 的子數組

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

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    MultiGABSE-AU物理層PMA層及PMD層的相關機制

    在之前的文章中,我們介紹了IEEE 802.3cz[1]協議,MultiGABSE-AU物理層中XMII、PCS層以及兩個可選功能的相關內容,本篇將介紹MultiGABSE-AU物理層PMA
    的頭像 發表于 12-23 10:20 ?938次閱讀
    MultiGABSE-AU物理層PMA<b class='flag-5'>子</b>層及PMD<b class='flag-5'>子</b>層的相關機制

    數組的下標為什么可以是負數

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

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

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

    TPSM560R6HEVM使用手冊

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

    使用TPSM560R6EVM

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

    數組名之間可以直接賦值嗎

    數組之間的賦值能不能直接使用等于號?比如這樣的代碼。 int main(){ int a[5] = {1, 2, 3, 4, 5}; int b[5] = {0}; b = a
    的頭像 發表于 11-26 11:23 ?521次閱讀

    指針數組和二維數組有沒有區別

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

    C語言數組應用計算機導論A第6講:數組

    C語言數組應用計算機導論A第6講:數組
    發表于 11-20 15:33 ?0次下載

    DS560MB410EVM用戶指南

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

    DS560DF810 EVM用戶指南

    電子發燒友網站提供《DS560DF810 EVM用戶指南.pdf》資料免費下載
    發表于 11-15 15:23 ?0次下載
    DS<b class='flag-5'>560</b>DF810 EVM用戶指南

    Q1和非Q1器件的TPS54340/360/540/560和TPS54340B/360B/540B/560B之間的差異

    電子發燒友網站提供《Q1和非Q1器件的TPS54340/360/540/560和TPS54340B/360B/540B/560B之間的差異.pdf》資料免費下載
    發表于 09-13 09:45 ?0次下載
    Q1和非Q1器件的TPS54340/360/540/<b class='flag-5'>560</b>和TPS54340B/360B/540B/<b class='flag-5'>560</b>B之間的差異

    labview字符串數組轉化為數值數組

    在LabVIEW中,將字符串數組轉換為數值數組是一項常見的任務,尤其是在處理數據采集、信號處理或用戶輸入時。 1. 理解LabVIEW的數據類型 在開始之前,了解LabVIEW中的數據類型是非
    的頭像 發表于 09-04 17:47 ?4941次閱讀

    使用stm32l451片,對ad7606進行3通道100k采樣值跳動問題?

    本人使用的是stm32l451片,對ad7606進行3通道100k采樣,采5000個點,硬件spi速度10m,主頻80m,出來的數據fft計算之后的電流值不停地在跳動,請問是什么問題,采樣部分用的是ll庫函數,請大佬指點一下
    發表于 08-19 10:04

    面試常考+1:函數指針與指針函數、數組指針與指針數組

    在嵌入式開發領域,函數指針、指針函數、數組指針和指針數組是一些非常重要但又容易混淆的概念。理解它們的特性和應用場景,對于提升嵌入式程序的效率和質量至關重要。一、指針函數與函數指針指針函數:定義:指針
    的頭像 發表于 08-10 08:11 ?1343次閱讀
    面試常考+1:函數指針與指針函數、<b class='flag-5'>數組</b>指針與指針<b class='flag-5'>數組</b>

    請問如何將幾十K大小的數組存放在flash里面,不占用內存空間呢?

    請問如何將幾十K大小的數組存放在flash里面,不占用內存空間呢? 用了const好像不管用,還是占用了heap空間。
    發表于 07-19 07:10
    主站蜘蛛池模板: 国产馆精品推荐在线观看 | 日韩欧美高清一区 | 色婷婷六月丁香七月婷婷 | 黄视频网站入口 | 成 人 色综合 | 精品免费福利视频 | 国产v精品成人免费视频400条 | www.淫.com| 国产h视频在线观看高清 | 理论免费 | 69日本xxxxxxxxx内谢 | 免费看一级视频 | 女人被狂躁视频免费网站 | 天天躁狠狠躁夜夜躁 | 天天爽天天爱 | 欧美激情五月 | 国产亚洲精品免费 | 国模吧双双大尺度炮交gogo | 拍拍拍美女黄色1000视频 | 亚洲国产高清人在线 | 国产精品污视频 | 国产婷婷一区二区三区 | 你懂的网站在线播放 | 免费人成网站在线高清 | 色爱区综合激情五月综合色 | 天天躁天天狠天天透 | 久久精品屋 | 天天干妹子 | 婷婷综合五月天 | 狠狠狠狠操| 操操操干干干 | 中文天堂最新版www 中文天堂最新版在线精品 中文天堂最新版在线中文 中文天堂最新版资源新版天堂资源 | 丁香花在线视频观看免费 | 人人爽天天爽夜夜爽qc | 国产一级特黄一级毛片 | 国产女人又爽又大 | 日本加勒比视频在线观看 | 久久在精品线影院精品国产 | 性做久久久久久 | 激情玖玖 | 日本吻胸抓胸激烈视频网站 |