色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

    文章

    2110

    瀏覽量

    73689
  • 代碼
    +關注

    關注

    30

    文章

    4793

    瀏覽量

    68702
  • 數組
    +關注

    關注

    1

    文章

    417

    瀏覽量

    25971

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

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

收藏 人收藏

    評論

    相關推薦

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

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

    Linux文件查找

    Linux文件查找 1.find查找概述 為什么要有文件查找,因為很多時候我們可能會忘了某個文件所在的位置,此時就需要通過find來查找。 find命令可以根據不同的條件來進行
    的頭像 發表于 12-03 17:09 ?278次閱讀

    AFE5818的幀時鐘FCLK不等于clkin,是它的二分頻,請問是為什么?

    AFE5818的幀時鐘FCLK不等于clkin,是它的二分頻,請問是為什么?
    發表于 11-18 08:34

    怎樣使用模擬電路實現信號的二分頻呢?

    請問怎樣使用模擬電路實現信號的二分頻呢?
    發表于 09-10 08:06

    阻正負極怎么區分

    、穩定性好等優點,被廣泛應用于各種電子設備中。 阻的分類 阻按照電阻值的排列方式,可以分為種類型:串聯型和并聯型。 2.1 串
    的頭像 發表于 08-21 09:12 ?550次閱讀

    器的端口有多少個

    器的端口數量可以根據其設計和應用需求來確定,常見的端口數量包括以下幾種: 端口 :即二分器(2-way power splitter),是最簡單的功器形式,具有一個輸入端口和
    的頭像 發表于 08-14 09:58 ?474次閱讀

    并聯電路總電阻與電阻的大小關系

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

    如何用C語言實現高效查找二分法)

    今天給分享一下使用C語言實現二分算法,主要包含以下幾部分內容:二分查找算法介紹二分查找算法使用場景二分
    的頭像 發表于 06-04 08:04 ?1169次閱讀
    如何用C語言實現高效<b class='flag-5'>查找</b>(<b class='flag-5'>二分</b>法)

    STM32F439的HASH模塊DMA傳輸計算問題求解

    項目中需要使用439的的HASH模塊計算文件的MD5值,使用的DMA方式,為了提高CPU效率,讓其他任務在DMA傳輸數據、硬件計算MD5期間可以得到運行,DMA的數據來自FMC外擴的SDRAM
    發表于 04-19 06:42

    /一充數據線方案介紹

    往往面臨同時為多個設備充電的困境,這時,Type-C一充線便成為解決方案中的佼佼者。 為了滿足廣大用戶對充電效率和便捷性的追求,推出了一套Type-C一
    的頭像 發表于 04-13 10:52 ?607次閱讀
    一<b class='flag-5'>分</b><b class='flag-5'>二</b>/一<b class='flag-5'>分</b>三<b class='flag-5'>快</b>充數據線方案介紹

    Type-C一充線智能分配方案

    隨著移動設備的普及和充技術的迅猛發展,Type-C接口已成為眾多手機、平板和筆記本電腦的標配。然而,在日常使用中,我們經常會遇到需要同時為多個設備充電的情況。這時,Type-C一
    的頭像 發表于 04-02 17:36 ?972次閱讀
    Type-C一<b class='flag-5'>分</b><b class='flag-5'>二</b><b class='flag-5'>快</b>充線智能分配方案

    二分頻電路總述 二分頻電路的功能實現

    分頻就是用同一個時鐘信號通過一定的電路結構轉變成不同頻率的時鐘信號。
    的頭像 發表于 03-06 17:13 ?2398次閱讀
    <b class='flag-5'>二分</b>頻電路總述 <b class='flag-5'>二分</b>頻電路的功能實現

    壓電路的原理和特點介紹

    電路的工作點、為測量設備提供參考電壓、電源管理等。 壓電路的特點: 1、串聯電路的電流處處相等; 2、串聯電路端的總電壓等于電路中,各用電器端的電壓之和; 3、串聯電路總電阻等于
    的頭像 發表于 02-02 15:22 ?8294次閱讀
    <b class='flag-5'>分</b>壓電路的原理和特點介紹

    恢復極管和肖特基極管可以互換嗎

    恢復極管和肖特基極管可以互換嗎   通常不可以。肖特基極管反向耐壓低,正向壓降小,適用于低電壓整流;恢復反向耐壓高,正向壓降
    的頭像 發表于 02-02 09:35 ?3689次閱讀

    恢復極管與整流極管能代換使用嗎?

    恢復極管與整流極管能代換使用嗎? 恢復極管和整流極管雖然在某些方面具有相似的特點,但
    的頭像 發表于 01-12 14:43 ?3248次閱讀
    主站蜘蛛池模板: 成人小视频在线观看免费| 校园女教师之禁区| 俄罗斯xxxxxbbbbb| 亚洲欧美成人无码久久久| 嫩草AV久久伊人妇女| 国产一区亚洲| 大胸美女脱内衣黄网站| 91九色porny蝌蚪| 亚洲区 bt下载| 特黄特色大片免费播放器9| 蜜柚视频在线观看全集免费观看 | 92午夜免费福利757| 西西人体大胆牲交PP6777| 欧美一区二区高清| 老师紧窄粉嫩| 久草在在线免视频在线观看| 国产国产成人人免费影院| wwwxxx日本护士| 99国产在线视频有精品视频| 有码 亚洲 制服 国产 在线| 亚洲高清国产拍精品影院| 色狠狠色狠狠综合天天| 欧美亚洲日韩一道免费观看| 久久伊人中文字幕有码| 久久re热在线视频精69| 韩国甜性涩爱| 国产色无码精品视频国产| 国产成人精视频在线观看免费| 插我一区二区在线观看| s8sp视频高清在线播放| 99久久免费国内精品| 91成品视频| 91看片淫黄大片.在线天堂| 中文字幕在线观看网址| 在线免费观看a视频| 一攻多受高h大总攻| 樱桃熟了A级毛片| 在线 自拍 综合 亚洲 欧美| 野花韩国高清完整版在线观看5| 亚洲精品卡2卡3卡4卡5卡区| 亚洲国产精品嫩草影院久久|