女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

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

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

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

hash表、快排與二分查找:兩數(shù)之和

算法與數(shù)據(jù)結(jié)構(gòu) ? 來(lái)源:碼農(nóng)的荒島求生 ? 作者:碼農(nóng)的荒島求生 ? 2022-04-26 14:43 ? 次閱讀

今天的題目是兩數(shù)之和,題目是這樣的:

給定一個(gè)整數(shù)數(shù)組與一個(gè)target,在數(shù)組中找到兩個(gè)數(shù),其和等于target,并返回這兩個(gè)數(shù)字的下標(biāo)。

示例:

數(shù)組 nums = [2,7,11,15], target = 9,則輸出[0,1],因?yàn)閚ums[0] + nums[1] == 9

題目不難,解決方法也有很多種,我們依次來(lái)看一下,任何題目都可以從最簡(jiǎn)單的方法開(kāi)始去想,以下代碼均為C++

暴力解法

我們首先固定一個(gè)數(shù)字,比如第一個(gè)數(shù)字2,然后遍歷后面的元素,判斷是否相加等于9,有就記錄下來(lái),沒(méi)有則看下一個(gè)數(shù)字,也就是7,最終代碼非常簡(jiǎn)單,其時(shí)間復(fù)雜度為O(n^2):

vectortwoSum(vector&nums,inttarget){
vectorres;
for(inti=0;ifor(intj=i+1;jif(nums[i]+nums[j]==target){
res.push_back(i);
res.push_back(j);
}
}
}
returnres;
}

萬(wàn)萬(wàn)沒(méi)想到的是這樣的代碼竟然可以AC(AC是刷題的常用術(shù)語(yǔ),也就是Accept,通過(guò)代碼的評(píng)測(cè)標(biāo)準(zhǔn),包括正確性、耗時(shí)、內(nèi)存的消耗等等)。

從這里的分析我們其實(shí)可以知道,這本質(zhì)上其實(shí)是一個(gè)搜索問(wèn)題,假如我知道第一個(gè)數(shù)字是2,而target是9,那么我們需要回答“這個(gè)數(shù)組中是否有7這個(gè)數(shù)字”,因此這本質(zhì)上是一個(gè)搜索問(wèn)題。

既然是搜索問(wèn)題,那么hash表顯然是我們最得力的武器

hash 表

關(guān)于hash表后續(xù)會(huì)有專題詳解。

4354af3a-c3bd-11ec-bce3-dac502259ad0.png

C++中基于hash表這種數(shù)據(jù)結(jié)構(gòu)的是std::unordered_map,我們的思路也很簡(jiǎn)單,把所有的數(shù)組元素作為key,數(shù)組下標(biāo)作為值,因?yàn)轭}目要求我們返回下標(biāo),因此這里必須把下標(biāo)也存儲(chǔ)起來(lái),有了這樣的map,剩下的就簡(jiǎn)單了。

依次遍歷數(shù)組中每個(gè)元素N,查找target-N是否存在于map中即可。

vectortwoSum(vector&nums,inttarget){
unordered_mapmap;
vectorres;

for(inti=0;iif(iter==map.end()){
map[nums[i]]=i;
}else{
res.push_back(i);
res.push_back(iter->second);
}
}
returnres;
}

顯然,該算法時(shí)間復(fù)雜度是O(n),因?yàn)橐话闱闆r下可以認(rèn)為hash表能常數(shù)復(fù)雜度下查找到元素。

是不是覺(jué)得很簡(jiǎn)單,注意,這里使用了map容器,那如果面試官要求你不得借助這種已經(jīng)寫(xiě)的庫(kù)該怎么辦呢?

我們?cè)谖恼麻_(kāi)頭分析過(guò),這其實(shí)本質(zhì)上是一個(gè)搜索問(wèn)題,既然是搜索問(wèn)題,那么解決該問(wèn)題的另一種思路就是排序

只要排好序剩下的就簡(jiǎn)單了,二分查找天然就是有序搜索問(wèn)題的好幫手

因此接下來(lái)的思路就是排序加二分查找

4367d646-c3bd-11ec-bce3-dac502259ad0.png

排序加二分查找

思路已經(jīng)介紹完畢,接下來(lái)我們手寫(xiě)快排,但是我們排誰(shuí)呢?

注意題目要求返回元素下標(biāo),因此排序時(shí)需要除了數(shù)組元素也需要把下標(biāo)帶上。

voidquick_sort(vector>&nums,intb,inte){
if(b>e)return;

inti=b-1;
for(intk=b;kif(nums[k].second

有的同學(xué)可能沒(méi)有看懂這里的排序方法,甚至認(rèn)為快排之類的排序算法只能靠死記硬背,其實(shí)不是的,這類經(jīng)典的排序算法背后都有極其重要的算法思想,比如快排背后的思想其實(shí)是divide and conquer,這是另一個(gè)龐大的話題,限于篇幅,我們會(huì)在后續(xù)專題詳解。

現(xiàn)在快排有了,接下來(lái)實(shí)現(xiàn)二分查找:

intbinary_search(vector>&nums,
intb,inte,inttarget){
while(b<=?e)?{
????????int?m?=?(b?+?e)?/?2;
????????if(nums[m].second==target){
returnnums[m].first;
}elseif(nums[m].secondelse{
e=m-1;
}
}
return-1;
}

二分查找是一個(gè)看起來(lái)極其容易但寫(xiě)起來(lái)卻極其容易出錯(cuò)的算法,不信你可以試試看,這里暫時(shí)還不打算詳細(xì)講解二分,后續(xù)還會(huì)多次遇到這個(gè)算法,當(dāng)我們積攢了足夠多的示例后將系統(tǒng)介紹這里涉及的快排與二分。

有了這些函數(shù)后就可以實(shí)現(xiàn)主要邏輯了:

vectortwoSum(vector&nums,inttarget){
vectorres;
vector>nums_index;
intsize=nums.size();

for(inti=0;i(i,nums[i]));
}

quick_sort(nums_index,0,size-1);

for(inti=0;iif(r!=-1){
res.push_back(nums_index[i].first);
res.push_back(r);
}
}
returnres;
}

運(yùn)行一下發(fā)現(xiàn)耗時(shí)1s左右,雖然也可以AC,但可以看到運(yùn)行速度其實(shí)是很慢的,還是hash表這種解法速度最快。

可以看到,一道題目其實(shí)有很多解法,這里涉及到hash、快排與二分查找,后續(xù)我們還會(huì)多次見(jiàn)到這些方法,而我們?cè)诜e攢足夠多的示例后會(huì)系統(tǒng)性講解這些數(shù)據(jù)結(jié)構(gòu)與算法。

--- EOF ---

審核編輯 :李倩


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

    關(guān)注

    22

    文章

    2117

    瀏覽量

    74772
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4886

    瀏覽量

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

    關(guān)注

    1

    文章

    419

    瀏覽量

    26365

原文標(biāo)題:hash表、快排與二分查找:兩數(shù)之和

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    請(qǐng)問(wèn)對(duì)SPDIF_Rx傳來(lái)的48K,24Bit立體聲信號(hào)作約160階FIR電子二分頻濾波器需怎樣的MCU性能?

    請(qǐng)問(wèn)對(duì)SPDIF_Rx 傳來(lái)的48K,24Bit立體聲信號(hào)作約160階FIR電子二分頻濾波器需怎樣的MCU性能?
    發(fā)表于 04-29 07:00

    請(qǐng)問(wèn)對(duì)SPDIF_Rx 傳來(lái)的48K,24Bit立體聲信號(hào)作約160階FIR電子二分頻濾波器需怎樣的MCU性能?

    請(qǐng)問(wèn)對(duì)SPDIF_Rx 傳來(lái)的48K,24Bit立體聲信號(hào)作約160階FIR電子二分頻濾波器需怎樣的MCU性能?
    發(fā)表于 04-24 06:33

    請(qǐng)問(wèn)對(duì)SPDIF_Rx傳來(lái)的48K,24Bit立體聲信號(hào)作約160階FIR電子二分頻濾波器需怎樣的MCU性能?

    請(qǐng)問(wèn)對(duì)SPDIF_Rx 傳來(lái)的48K,24Bit立體聲信號(hào)作約160階FIR電子二分頻濾波器需怎樣的MCU性能?
    發(fā)表于 04-22 07:42

    MDD恢復(fù)極管的應(yīng)用設(shè)計(jì)

    1.恢復(fù)極管概述恢復(fù)極管(FastRecoveryDiode,FRD)是一種專門用于高頻整流應(yīng)用的極管,其特點(diǎn)是具有短反向恢復(fù)時(shí)間
    的頭像 發(fā)表于 03-27 11:11 ?297次閱讀
    MDD<b class='flag-5'>快</b>恢復(fù)<b class='flag-5'>二</b>極管的應(yīng)用設(shè)計(jì)

    恢復(fù)極管與肖特基極管的異同點(diǎn)解析

    在電力電子和開(kāi)關(guān)電源設(shè)計(jì)中,恢復(fù)極管和肖特基極管是類高頻應(yīng)用中的核心器件。盡管者均用于整流和開(kāi)關(guān)場(chǎng)景,但其工作原理、性能特點(diǎn)及適用
    的頭像 發(fā)表于 02-24 15:37 ?773次閱讀
    <b class='flag-5'>快</b>恢復(fù)<b class='flag-5'>二</b>極管與肖特基<b class='flag-5'>二</b>極管的異同點(diǎn)解析

    數(shù)顯千分表的數(shù)據(jù)如何用存儲(chǔ)器進(jìn)行接收?

    數(shù)顯千分表的數(shù)據(jù)如何用存儲(chǔ)器進(jìn)行接收
    發(fā)表于 02-11 06:01

    DAC3482設(shè)置DACCLK時(shí),到底需要設(shè)置成和DATACLK相等還是二分之一的關(guān)系?

    =DACCLK時(shí)則可以看到報(bào)警寄存器先為不沖突,一段時(shí)間后變?yōu)?-away,再過(guò)一段時(shí)間變?yōu)?-away,再過(guò)一段時(shí)間變?yōu)閒ifo-collision,依次循環(huán),請(qǐng)問(wèn)我設(shè)置DACCLK時(shí)到底需要設(shè)置成和DATACLK相等還是二分之一的關(guān)系????求解救啊
    發(fā)表于 01-08 07:24

    為什么DAC7811輸出電壓是理論值的二分之一?

    為什么輸出電壓是理論值的二分之一?
    發(fā)表于 12-12 07:58

    Linux文件查找

    Linux文件查找 1.find查找概述 為什么要有文件查找,因?yàn)楹芏鄷r(shí)候我們可能會(huì)忘了某個(gè)文件所在的位置,此時(shí)就需要通過(guò)find來(lái)查找。 find命令可以根據(jù)不同的條件來(lái)進(jìn)行
    的頭像 發(fā)表于 12-03 17:09 ?620次閱讀

    AFE5818的幀時(shí)鐘FCLK不等于clkin,是它的二分頻,請(qǐng)問(wèn)是為什么?

    AFE5818的幀時(shí)鐘FCLK不等于clkin,是它的二分頻,請(qǐng)問(wèn)是為什么?
    發(fā)表于 11-18 08:34

    怎樣使用模擬電路實(shí)現(xiàn)信號(hào)的二分頻呢?

    請(qǐng)問(wèn)怎樣使用模擬電路實(shí)現(xiàn)信號(hào)的二分頻呢?
    發(fā)表于 09-10 08:06

    阻正負(fù)極怎么區(qū)分

    、穩(wěn)定性好等優(yōu)點(diǎn),被廣泛應(yīng)用于各種電子設(shè)備中。 阻的分類 阻按照電阻值的排列方式,可以分為種類型:串聯(lián)型和并聯(lián)型。 2.1 串
    的頭像 發(fā)表于 08-21 09:12 ?1077次閱讀

    器的端口有多少個(gè)

    器的端口數(shù)量可以根據(jù)其設(shè)計(jì)和應(yīng)用需求來(lái)確定,常見(jiàn)的端口數(shù)量包括以下幾種: 端口 :即二分器(2-way power splitter),是最簡(jiǎn)單的功器形式,具有一個(gè)輸入端口和
    的頭像 發(fā)表于 08-14 09:58 ?840次閱讀

    并聯(lián)電路總電阻與電阻的大小關(guān)系

    端電壓相等,而電流則按照各自的電阻值分配的電路。這種連接方式被稱為并聯(lián)。 并聯(lián)電路的特點(diǎn) 并聯(lián)電路具有以下特點(diǎn): (1)各電阻器端的電壓相等; (2)各電阻器中的電流之和等于總電流; (3)總電阻小于任何一個(gè)電阻。
    的頭像 發(fā)表于 07-22 18:14 ?3752次閱讀

    如何用C語(yǔ)言實(shí)現(xiàn)高效查找二分法)

    今天給分享一下使用C語(yǔ)言實(shí)現(xiàn)二分算法,主要包含以下幾部分內(nèi)容:二分查找算法介紹二分查找算法使用場(chǎng)景二分
    的頭像 發(fā)表于 06-04 08:04 ?1652次閱讀
    如何用C語(yǔ)言實(shí)現(xiàn)高效<b class='flag-5'>查找</b>(<b class='flag-5'>二分</b>法)