国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

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

3天內不再提示

hash表、快排與二分查找:兩數之和

算法與數據結構 ? 來源:碼農的荒島求生 ? 作者:碼農的荒島求生 ? 2022-04-26 14:43 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

今天的題目是兩數之和,題目是這樣的:

給定一個整數數組與一個target,在數組中找到兩個數,其和等于target,并返回這兩個數字的下標。

示例:

數組 nums = [2,7,11,15], target = 9,則輸出[0,1],因為nums[0] + nums[1] == 9

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

暴力解法

我們首先固定一個數字,比如第一個數字2,然后遍歷后面的元素,判斷是否相加等于9,有就記錄下來,沒有則看下一個數字,也就是7,最終代碼非常簡單,其時間復雜度為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是刷題的常用術語,也就是Accept,通過代碼的評測標準,包括正確性、耗時、內存的消耗等等)。

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

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

hash 表

關于hash表后續會有專題詳解。

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

C++中基于hash表這種數據結構的是std::unordered_map,我們的思路也很簡單,把所有的數組元素作為key,數組下標作為值,因為題目要求我們返回下標,因此這里必須把下標也存儲起來,有了這樣的map,剩下的就簡單了。

依次遍歷數組中每個元素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;
}

顯然,該算法時間復雜度是O(n),因為一般情況下可以認為hash表能常數復雜度下查找到元素。

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

我們在文章開頭分析過,這其實本質上是一個搜索問題,既然是搜索問題,那么解決該問題的另一種思路就是排序

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

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

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

排序加二分查找

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

注意題目要求返回元素下標,因此排序時需要除了數組元素也需要把下標帶上。

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

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

有的同學可能沒有看懂這里的排序方法,甚至認為快排之類的排序算法只能靠死記硬背,其實不是的,這類經典的排序算法背后都有極其重要的算法思想,比如快排背后的思想其實是divide and conquer,這是另一個龐大的話題,限于篇幅,我們會在后續專題詳解。

現在快排有了,接下來實現二分查找:

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;
}

二分查找是一個看起來極其容易但寫起來卻極其容易出錯的算法,不信你可以試試看,這里暫時還不打算詳細講解二分,后續還會多次遇到這個算法,當我們積攢了足夠多的示例后將系統介紹這里涉及的快排與二分。

有了這些函數后就可以實現主要邏輯了:

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;
}

運行一下發現耗時1s左右,雖然也可以AC,但可以看到運行速度其實是很慢的,還是hash表這種解法速度最快。

可以看到,一道題目其實有很多解法,這里涉及到hash、快排與二分查找,后續我們還會多次見到這些方法,而我們在積攢足夠多的示例后會系統性講解這些數據結構與算法。

--- EOF ---

審核編輯 :李倩


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

    關注

    22

    文章

    2123

    瀏覽量

    77110
  • 代碼
    +關注

    關注

    30

    文章

    4967

    瀏覽量

    73960
  • 數組
    +關注

    關注

    1

    文章

    420

    瀏覽量

    27351

原文標題:hash表、快排與二分查找:兩數之和

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

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    安達發|生產、庫存準、交付穩——這個APS程軟件有點“神”

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

    數據算不清?它直接生成報告

    在雙碳目標深入推進的當下,碳核算已不是“選擇題”而是“必答題”。能源管理系統用數字化手段破解核算難題,讓碳數據從“算不清、算不準、耗時長”變為“算得、算得準、可追溯”,既為企業合規經營護航,也為綠色轉型注入動力。告別Exc
    的頭像 發表于 01-07 09:34 ?146次閱讀
    碳<b class='flag-5'>排</b>數據算不清?它直接生成報告

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

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

    進制查找(Binary Search)介紹

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

    安達發|衛浴智造,產有“”:揭秘APS計劃產軟件的智慧革命

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

    線性搜索與二分搜索介紹

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

    查找與多項式近似算法實現初等函數

    查找與多項式近似結合算法是一種把查找算法和多項式近似算法綜合到一起的算法。這種算法綜合了種基本算法各自優勢,通過將多項式各項系數存入
    發表于 10-28 08:10

    真隨機和偽隨機的區別

    隨機在當前程序運行環境中是一種常用參數,目前主要分為種,偽隨機和真隨機,本期我們就來講一下者的區別。
    的頭像 發表于 08-27 17:46 ?2633次閱讀

    用一杯咖啡的時間,讀懂AI二分類如何守護工業質量

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

    關于RK3568核心板可以下載固件成功,但是啟動失敗,串口打印日志顯示: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
    發表于 07-01 09:42

    請問對SPDIF_Rx傳來的48K,24Bit立體聲信號作約160階FIR電子二分頻濾波器需怎樣的MCU性能?

    請問對SPDIF_Rx 傳來的48K,24Bit立體聲信號作約160階FIR電子二分頻濾波器需怎樣的MCU性能?
    發表于 04-29 07:00

    請問對SPDIF_Rx 傳來的48K,24Bit立體聲信號作約160階FIR電子二分頻濾波器需怎樣的MCU性能?

    請問對SPDIF_Rx 傳來的48K,24Bit立體聲信號作約160階FIR電子二分頻濾波器需怎樣的MCU性能?
    發表于 04-24 06:33

    請問對SPDIF_Rx傳來的48K,24Bit立體聲信號作約160階FIR電子二分頻濾波器需怎樣的MCU性能?

    請問對SPDIF_Rx 傳來的48K,24Bit立體聲信號作約160階FIR電子二分頻濾波器需怎樣的MCU性能?
    發表于 04-22 07:42

    MDD超恢復極管的耐壓與電流選型:如何確保可靠性?

    在高頻開關電源、功率變換器和新能源應用中,超恢復極管因其短反向恢復時間(trr)和低開關損耗而被廣泛采用。然而,在選擇MDD超恢復極管時,耐壓(VRRM)和電流(IF,IFSM
    的頭像 發表于 04-09 10:21 ?1033次閱讀
    MDD超<b class='flag-5'>快</b>恢復<b class='flag-5'>二</b>極管的耐壓與電流選型:如何確保可靠性?

    MDD恢復極管的應用設計

    1.恢復極管概述恢復極管(FastRecoveryDiode,FRD)是一種專門用于高頻整流應用的極管,其特點是具有短反向恢復時間
    的頭像 發表于 03-27 11:11 ?1064次閱讀
    MDD<b class='flag-5'>快</b>恢復<b class='flag-5'>二</b>極管的應用設計