日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

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

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

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

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

算法與數(shù)據(jù)結(jié)構(gòu) ? 來源:碼農(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

題目不難,解決方法也有很多種,我們依次來看一下,任何題目都可以從最簡單的方法開始去想,以下代碼均為C++。

暴力解法

我們首先固定一個(gè)數(shù)字,比如第一個(gè)數(shù)字2,然后遍歷后面的元素,判斷是否相加等于9,有就記錄下來,沒有則看下一個(gè)數(shù)字,也就是7,最終代碼非常簡單,其時(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;
}

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

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

既然是搜索問題,那么hash表顯然是我們最得力的武器。

hash 表

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

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

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

依次遍歷數(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ù)雜度下查找到元素。

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

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

只要排好序剩下的就簡單了,二分查找天然就是有序搜索問題的好幫手。

因此接下來的思路就是排序加二分查找。

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

排序加二分查找

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

注意題目要求返回元素下標(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é)可能沒有看懂這里的排序方法,甚至認(rèn)為快排之類的排序算法只能靠死記硬背,其實(shí)不是的,這類經(jīng)典的排序算法背后都有極其重要的算法思想,比如快排背后的思想其實(shí)是divide and conquer,這是另一個(gè)龐大的話題,限于篇幅,我們會(huì)在后續(xù)專題詳解。

現(xiàn)在快排有了,接下來實(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è)看起來極其容易但寫起來卻極其容易出錯(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ì)多次見到這些方法,而我們?cè)诜e攢足夠多的示例后會(huì)系統(tǒng)性講解這些數(shù)據(jù)結(jié)構(gòu)與算法。

--- EOF ---

審核編輯 :李倩


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

    關(guān)注

    22

    文章

    2131

    瀏覽量

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

    關(guān)注

    30

    文章

    4977

    瀏覽量

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

    關(guān)注

    1

    文章

    420

    瀏覽量

    27476

原文標(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)推薦

    安達(dá)發(fā)|APS智能產(chǎn)單軟件在橡膠行業(yè)的深度應(yīng)用與未來趨勢

    安達(dá)發(fā)APS高級(jí)生產(chǎn)計(jì)劃智能產(chǎn)程自動(dòng)單軟件系統(tǒng)推薦_MES 在橡膠行業(yè)面臨產(chǎn)能過剩、產(chǎn)業(yè)結(jié)構(gòu)不合理、市場競爭混亂等多重挑戰(zhàn)的背景下,APS智能產(chǎn)
    的頭像 發(fā)表于 04-20 16:43 ?207次閱讀
    安達(dá)發(fā)|APS智能<b class='flag-5'>排</b>產(chǎn)<b class='flag-5'>排</b>程<b class='flag-5'>排</b>單軟件在橡膠行業(yè)的深度應(yīng)用與未來趨勢

    安達(dá)發(fā)|生產(chǎn)、庫存準(zhǔn)、交付穩(wěn)——這個(gè)APS程軟件有點(diǎn)“神”

    在當(dāng)今競爭激烈的家電行業(yè),高效的生產(chǎn)管理是企業(yè)脫穎而出的關(guān)鍵。而APS程軟件,正逐漸成為家電企業(yè)提升生產(chǎn)效率、降低成本的秘密武器。 APS程軟件是什么? APS,即高級(jí)計(jì)劃與
    的頭像 發(fā)表于 03-04 17:05 ?456次閱讀
    安達(dá)發(fā)|生產(chǎn)<b class='flag-5'>快</b>、庫存準(zhǔn)、交付穩(wěn)——這個(gè)APS<b class='flag-5'>排</b>程軟件有點(diǎn)“神”

    安達(dá)發(fā)|APS智能產(chǎn)單軟件:化學(xué)品行業(yè)的效率革命

    在競爭激烈的化學(xué)品行業(yè),生產(chǎn)管理的高效性和精準(zhǔn)性直接關(guān)系到企業(yè)的生存與發(fā)展。傳統(tǒng)的生產(chǎn)產(chǎn)程方式往往依賴人工經(jīng)驗(yàn),不僅效率低下,還容易出現(xiàn)錯(cuò)誤和延誤。而 APS 智能產(chǎn)
    的頭像 發(fā)表于 01-29 16:29 ?252次閱讀
    安達(dá)發(fā)|APS智能<b class='flag-5'>排</b>產(chǎn)<b class='flag-5'>排</b>程<b class='flag-5'>排</b>單軟件:化學(xué)品行業(yè)的效率革命

    數(shù)據(jù)算不清?它直接生成報(bào)告

    在雙碳目標(biāo)深入推進(jìn)的當(dāng)下,碳核算已不是“選擇題”而是“必答題”。能源管理系統(tǒng)用數(shù)字化手段破解核算難題,讓碳數(shù)據(jù)從“算不清、算不準(zhǔn)、耗時(shí)長”變?yōu)椤八愕?b class='flag-5'>快、算得準(zhǔn)、可追溯”,既為企業(yè)合規(guī)經(jīng)營護(hù)航,也為綠色轉(zhuǎn)型注入動(dòng)力。告別Exc
    的頭像 發(fā)表于 01-07 09:34 ?310次閱讀
    碳<b class='flag-5'>排</b>數(shù)據(jù)算不清?它直接生成報(bào)告

    PCB短路問題:用萬用測量了針輸入與地個(gè)針腳

    用萬用測量了針輸入與地個(gè)針腳,電阻不到1歐姆,但是看了很久電路,也沒有發(fā)現(xiàn)地與電源線有直接接觸,麻煩各路大神,幫忙分析下,要實(shí)物,可以給寄過去
    發(fā)表于 01-05 23:26

    進(jìn)制查找(Binary Search)介紹

    進(jìn)制查找(Binary Search)用于在已排序的數(shù)組中執(zhí)行進(jìn)制查找的函數(shù)。 int binary_search(int arr[], int size, int targ
    發(fā)表于 12-12 06:54

    安達(dá)發(fā)|衛(wèi)浴智造,產(chǎn)有“數(shù)”:揭秘APS計(jì)劃產(chǎn)軟件的智慧革命

    的生產(chǎn)計(jì)劃產(chǎn)主要依靠人工經(jīng)驗(yàn)。想象一下,生產(chǎn)主管拿著厚厚的訂單表格和生產(chǎn)進(jìn)度,在辦公室里冥思苦想,試圖合理安排每一道工序的時(shí)間和資源。這種方式不僅效率低下,而且容易出錯(cuò)。據(jù)相關(guān)數(shù)據(jù)顯示,采用傳統(tǒng)產(chǎn)方式的衛(wèi)浴企業(yè),
    的頭像 發(fā)表于 12-09 14:53 ?538次閱讀
    安達(dá)發(fā)|衛(wèi)浴智造,<b class='flag-5'>排</b>產(chǎn)有“<b class='flag-5'>數(shù)</b>”:揭秘APS計(jì)劃<b class='flag-5'>排</b>產(chǎn)軟件的智慧革命

    線性搜索與二分搜索介紹

    線性搜索(Linear Search):從數(shù)組的第一個(gè)元素開始,依次將當(dāng)前元素與目標(biāo)值進(jìn)行比較,直到找到目標(biāo)值或搜索完整個(gè)數(shù)組。 二分搜索(Binary Search):在有序數(shù)組中查找某一特定元素
    發(fā)表于 12-01 07:36

    電能會(huì) “爆” 嗎?機(jī)械 / 家用 / 充樁場景的計(jì)量真相拆解

    一文理清:為何家用電表難 “爆”,充樁卻會(huì)?
    的頭像 發(fā)表于 11-12 09:25 ?3445次閱讀
    電能<b class='flag-5'>表</b>會(huì) “爆<b class='flag-5'>表</b>” 嗎?機(jī)械 / 家用 / <b class='flag-5'>快</b>充樁場景的計(jì)量真相拆解

    詳解SOA的增益譜仿真

    本文利用簡化的載流子速率方程,以及二分法迭代,仿真得到了外部注入(電流及輸入光功率)與增益的關(guān)系。
    的頭像 發(fā)表于 11-08 09:58 ?902次閱讀
    詳解SOA的增益譜仿真

    查找與多項(xiàng)式近似算法實(shí)現(xiàn)初等函數(shù)

    查找與多項(xiàng)式近似結(jié)合算法是一種把查找算法和多項(xiàng)式近似算法綜合到一起的算法。這種算法綜合了種基本算法各自優(yōu)勢,通過將多項(xiàng)式各項(xiàng)系數(shù)存入
    發(fā)表于 10-28 08:10

    NI數(shù)采卡 差AB正交編碼器信號(hào)采集

    請(qǐng)教一下各位,如何使用NI數(shù)采卡采集差輸入AB正交編碼器角度信號(hào)。 PCIE-6320/6340 usb6210/6421 在不增加差轉(zhuǎn)單端模塊的情況下,如何接線和設(shè)置DAQ參數(shù)。
    發(fā)表于 10-20 09:15

    真隨機(jī)數(shù)和偽隨機(jī)數(shù)的區(qū)別

    隨機(jī)數(shù)在當(dāng)前程序運(yùn)行環(huán)境中是一種常用參數(shù),目前主要分為種,偽隨機(jī)數(shù)和真隨機(jī)數(shù),本期我們就來講一下者的區(qū)別。
    的頭像 發(fā)表于 08-27 17:46 ?2919次閱讀

    用一杯咖啡的時(shí)間,讀懂AI二分類如何守護(hù)工業(yè)質(zhì)量

    您是否想過,工廠里那些"非黑即白"的判斷,正由AI用最簡潔的邏輯守護(hù)質(zhì)量?今天,讓我們通過一個(gè)零件組裝中的彈墊錯(cuò)裝、漏裝、多裝、錯(cuò)序分類案例,拆解AI二分類技術(shù)的核心
    的頭像 發(fā)表于 07-08 07:35 ?981次閱讀
    用一杯咖啡的時(shí)間,讀懂AI<b class='flag-5'>二分</b>類如何守護(hù)工業(yè)質(zhì)量

    關(guān)于RK3568核心板可以下載固件成功,但是啟動(dòng)失敗,串口打印日志顯示:HASH(c): error Invalid DTB hash !

    DTB: rk3568-atk-evb1-mipi-dsi-1080p#_saradc_ch2=341.dtb HASH(c): error Invalid DTB hash ! No find valid DTB, ret=-22
    發(fā)表于 07-01 09:42
    拜泉县| 永城市| 金华市| 湖南省| 黄石市| 营山县| 嘉峪关市| 阿鲁科尔沁旗| 武川县| 花莲县| 河曲县| 克什克腾旗| 安图县| 石嘴山市| 东乌珠穆沁旗| 双鸭山市| 全南县| 房山区| 怀化市| 谷城县| 石阡县| 宿州市| 无锡市| 呈贡县| 镇宁| 南乐县| 兴文县| 盐山县| 颍上县| 翁源县| 大竹县| 大化| 延边| 乳源| 朝阳市| 广南县| 临清市| 临猗县| 肃宁县| 泸州市| 汾西县|