给定数组 求和等于固定值 算法_[见题拆题] 大厂面试算法真题解析 - 第一期开张...
如今想要收獲大廠offer,在面試的前幾輪,總是躲不開算法這座大山。
常聽人說,算法很難。這話沒錯。算法本身是是一個艱深的方向。但是算法題卻有據(jù)可循。通過有針對性的學習和練習,我們完全可以掌握解題的基本方法和技巧,見題拆題,掃清通往offer之路上的障礙。
看看手上這些各個大廠的面試算法真題,我想,不如開始一個新的系列,和大家一起解析真題,學習解題方法,開闊解題思路。頭腦越練習,越靈光。
接下來,就讓我們來看第一題:
題目
[來自Google]
Given a list of numbers and a number k, return whether any two numbers from the list add up to k
給定一組數(shù)字,以及一個數(shù)字k,確定這組數(shù)字中,是否存在任意兩個數(shù)字,其相加之和等于k。
解析
初次見到一個問題,如果暫時沒有什么特別清晰的思路或靈感,不妨安下心來,首先想一想這道題目的暴力解法。
簡單粗暴的暴力解法不考慮效率和美觀,只考慮正確性,所以往往效率較低。但是,通過觀察暴力解法中冗余或者重復的部分,我們就可以找到進一步優(yōu)化的切入點,想出更有效率的算法。
小技巧: 在面試中,如果暫時頭腦空白,想不到漂亮的解法,不妨坦率地用簡潔的話語先描述一下暴力解法,在這個過程中發(fā)現(xiàn)思路,找到優(yōu)化解法。這個過程,也有助于面試官考察你的整體解題思路,還可能給你加分喲暴力解法
這道題的暴力解法很簡單。 只要將數(shù)組中所有數(shù)字對求和,然后和給定的數(shù)字k相比較,就知道是否有和k相等的值了。 假設(shè)數(shù)組中有n個數(shù)字,將暴力解法寫成偽代碼pseudo code的話,就是這個樣子:
function sumEqualsToK(array, k): for i=1 to n-1for j=n+1 to nif array[i] + array[j] == kreturn true return false暴力解法使用了兩個嵌套在一起的循環(huán),顯而易見,它的時間復雜度是O(n^2)。為了降低時間復雜度,我們來分析一下暴力解法中冗余或者重復的部分。
暴力解法試圖對數(shù)組中所有 數(shù)字對進行求和操作。 這部分操作是否存在冗余的部分呢? 我們能不能減少需要查看的數(shù)字對的數(shù)量呢? 想要對這一點進行優(yōu)化,我們就要利用題目中的另一個線索,也就是數(shù)字k了。
其實這道題目就是在給元素“配對兒”。 對于數(shù)組中的任一數(shù)字array[i],如果希望它和它的“另一半”相加之和等于k,那就意味著它的“另一半”的值必須是k-array[i]。 也就是說,只要數(shù)組中也存在一個等于k-array[i]的元素,就可以滿足相加等于k這個條件了:
例子: k = 10 array = [ 4, 2, 5, 6, 8 ]那么我們尋找的“另一半”們就是:[ 10-4, 10-2, 10-5, 10-6, 10-8 ] 也就是 [6, 8, 5, 4, 2]這樣一來,我們的問題就轉(zhuǎn)換成: 給定數(shù)組 array = [ 4, 2, 5, 6, 8 ],以及數(shù)組 target = [ 6, 8, 5, 4, 2 ], array[i]和target[i]是不是同時存在于array中在這個例子中,大家要格外關(guān)注5這個元素 5正好是k值的一半,所以array和target都包含了5 只有在原數(shù)組中包含了兩個5,才能相加等于10好了,現(xiàn)在我們已經(jīng)有了進一步優(yōu)化暴力解法的思路了。 在揭曉優(yōu)化解法的偽代碼之前,請你先開動腦筋,試著自己把代碼寫出來吧
思考~思考~
優(yōu)化解法
時間到~下面就是優(yōu)化算法的偽代碼了:
function sumEqualsToK(array, k): for i=1 to nif map contains array[i]return trueelseput k-array[i] into map return false在優(yōu)化算法中,我們使用了一個map來記錄我們想要尋找的“另一半”的元素,也就是之前例子里面提到的target
接下來,我們只需要遍歷array一次。 如果array[i]已經(jīng)和map中的元素相符,就說明array[i]和我們之前遍歷到的某一個元素恰好是相加為k的“一對兒”,算法直接返回true。 如果不相符,那么我們就把k-array[i]放進map中去,期待接下來遍歷到的元素能夠和k-array[i]相符。
這個優(yōu)化算法只需要遍歷array一次,所以它的時間復雜度只有O(n)。而我們最多也只會將array中所有元素的“另一半”放進map中去,所以算法的空間復雜度也是O(n)
實現(xiàn)
想出解法只是第一步,為了正確地實現(xiàn)解法,我們還需要考慮實現(xiàn)中的細節(jié)。 讓我們想一想這個問題的輸入和輸出:
輸出
這個問題的輸出很簡單,就是一個boolean值,true/false
輸入
題目中對于輸入的表達較為模糊 沒有說明array的長度,也沒有說明元素和k的具體類型 格外要注意的是,由于在解題過程中需要進行求和操作,我們要謹慎選擇在實現(xiàn)中使用的變量類型。兩數(shù)之和的范圍可能遠遠大于單一數(shù)字的范圍,所以根據(jù)實現(xiàn)語言的不同,要小心避免求和操作造成溢出
小技巧:在面試中,遇到題目中比較模糊的描述,一定記得要和面試官溝通,以便得到更多信息。至少,要向面試官詢問基本的輸入輸出的細節(jié)。這樣一來,面試官可以看出你對于問題的思考較為全面和縝密,也是加分項呢不同公司的面試方法不同,有些會要求候選人寫下完整地實現(xiàn)解法,有些只需要候選人寫出偽代碼就可以了。但是在練習時,我建議大家還是盡量寫下具體的實現(xiàn),至少也要思考一下實現(xiàn)的細節(jié)。
在這個系列里,我不會給出具體的實現(xiàn)代碼,因為大家掌握的實現(xiàn)語言各不相同。不過,歡迎大家提出實現(xiàn)時遇到的問題,我們可以集思廣益,一起解決~
總結(jié)
這道題目很精巧。它不涉及任何著名的,大家耳熟能詳?shù)乃惴?#xff0c;但是可以很好地考察候選人對暴力解法進行優(yōu)化的完整的思考過程,還可以考察候選人對于輸入輸出的要求所進行的思考。 小而強大~也許這就是Google使用這道題目的原因吧~
恭喜各位成功解決了第一道大廠面試真題~可以好好休息一下了~
[轉(zhuǎn)載請注明]
歡迎關(guān)注課程:
一站式學習Java網(wǎng)絡(luò)編程_全面理解BIO/NIO/AIO-慕課網(wǎng)實戰(zhàn)?coding.imooc.com全面掌握MongoDB 4.0-完成從小白到達人的蛻變-慕課網(wǎng)實戰(zhàn)?coding.imooc.comMongoDB 4.0新特性?www.imooc.com總結(jié)
以上是生活随笔為你收集整理的给定数组 求和等于固定值 算法_[见题拆题] 大厂面试算法真题解析 - 第一期开张...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: named 客户端无法解析_Outloo
- 下一篇: mock模拟接口测试_Python接口测