Leetcode兩數之和演算法與分析

2021-09-25 01:12:07 字數 1377 閱讀 9294

@leetcode兩數之和演算法

題幹如下:

給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的 兩個 整數。

你可以假設每種輸入只會對應乙個答案。但是,你不能重複利用這個陣列中同樣的元素。

示例如下:

給定nums = [2, 7, 11, 15], target = 9

因為 nums[0] + nums[1] = 2 + 7 = 9

所以返回 [0, 1]

但凡是乙個如正在編寫部落格的我一樣的程式設計小白,都會認為這是一道容易題,簡而言之,就是一道不用過腦子的暴力列舉題。

誠然,使用暴力列舉是其中的一種方法,其時間複雜度也僅有o(n²),當資料量很小的時候,這確實是乙個下策。

讓我們看看基礎的暴力列舉法:

**如下:

暴力列舉思路比較簡單,使用i變數標記作為第乙個比較物件,接著從其之後的位置開始移動裡j變數標記作為第二個比較物件,將它們相加與target進行比較,如果比較成功就可以打破迴圈並且輸出,否則就繼續下乙個j,當所有資料都已作為第二個比較物件之後,i移動到下乙個位置,並重複之前的迴圈,如此遍歷即可解決問題,雖然思路簡單,可是用時極長。

但我們僅僅知道蝸牛爬的暴力演算法是不夠的,還有一類雜湊表(hashtable)的演算法可以使用,雜湊演算法可以分為一遍雜湊和兩遍雜湊,其不同點在於,一遍雜湊將對雜湊表的建立和查詢集合在了一起。使用這類演算法可以使得本題的複雜度降低至o(n),速度有所提高,且思路並不複雜。

雜湊表求解法:

**如下:

從上面的**可以看出,首先我們需要建立乙個無向圖來存放這個雜湊表,之後我們可以變通思路,既然本題確定有解,即有兩數之和相加確定等於target,也即說明target減去正在判斷的某數,必然會等於之後的某數。那麼我們可以先定義乙個compare變數作為比較變數,如果在雜湊表中發現了與之相同的數,就說明該數存在,即可輸出。值得注意的一點是,最後有一句hashtable[num[i]] = i的語句,這句話的作用是建立雜湊對映,由此可見此方法是將建立與查詢合二為一的一遍雜湊法。對比可以看出,相較於之前的暴力列舉,雜湊法明顯縮短了耗時。

leetcode 兩數之和與兩數之和

題目描述 給定乙個已按照公升序排列 的有序陣列,找到兩個數使得它們相加之和等於目標數。函式應該返回這兩個下標值 index1 和 index2,其中 index1 必須小於 index2。說明 返回的下標值 index1 和 index2 不是從零開始的。你可以假設每個輸入只對應唯一的答案,而且你不...

刷演算法 LeetCode 兩數之和

給定乙個整數陣列和乙個目標值,找出陣列中和為目標值的兩個數。你可以假設每個輸入只對應一種答案,且同樣的元素不能被重複利用。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 nums 1 2 7 9 所以返回 0,1 複製 第一感覺是和我之前做過的題類似,就想先排序然後左...

LeetCode演算法題庫 兩數之和

給定乙個整數陣列 nums 和乙個目標值target,請你在該陣列中找出和為目標值的那兩個整數,並返回他們的陣列下標。注意 你可以假設每種輸入只會對應乙個答案。但是,你不能重複利用這個陣列中同樣的元素。public static int twosum int nums,int target map....