大家好,我是二分算法,很多人最初接觸到算法時候最先認識的就是我。我呢,說難不難,說簡單也千萬不要大意。
什么,你問我是誰?
說到我為什么而來,昨天我和阿大玩了一個游戲,很好的詮釋了這個問題。這個游戲的規(guī)則很簡單,一個人在心中想一個1到100的數(shù)字,另一個人猜。猜的過程中,一方只能告訴另一方是大了還是小了。猜的次數(shù)最少的人獲勝。
第一局我心里想的數(shù)字是57,阿大就這樣,從1開始猜到了57,猜了57次。
第二局輪到我了,想想我可是二分查找算法,最擅長的是什么?就是查找啊,阿大這次輸定了,看我如何以最快的速度找到他心里想的數(shù)字。
第一次,我猜了個數(shù)字50,阿大告訴我小了。
第二次,我猜了個數(shù)字75,阿大告訴我大了。
第三次,我猜了個數(shù)字63,阿大告訴我大了。
第四次,我猜了個數(shù)字57,阿達告訴我對了。
他竟然和我想的數(shù)字是一個!狡詐。
可是我依然以巨大的差距贏得了阿大。
阿大感到不服氣,覺得是我運氣好,其實我只是做了一個我最擅長的事情而已——二分算法。
從一開始,我并不知道他心里想的數(shù)字是什么,我只猜最中間的數(shù)字50,這樣無論是大了還是小了,都會有一半的數(shù)字被50過濾掉,接下來,我從有效的一半數(shù)字中,再找中間的數(shù)字,又可以過濾掉一半的數(shù)字,直到找到這個數(shù)字為止,所以對于100個數(shù)字來說,我最多最多也只需要7次而已,
這比阿大的傻找真的少太多了,看看1000次呢,也最多只需要14次。
看了這個游戲,是不是覺得我很好了解?只需要滿足兩個條件就行了,
第一是一串有序的數(shù)。
第二一直找“中間”的數(shù)字,直到找到為止。
另外我也知道,在面試中,常常遇到的是給你一個數(shù)字,讓你把他找出來。這樣的代碼實現(xiàn)。
阿大說每次算法題,他都是背下來,然后讓寫什么就寫什么。這樣是很危險的,我比較單純簡單,但是遇到了我那些復雜的算法兄弟,稍微一變形,就把你考住了。
所以要寫算法代碼,最重要的就是把你理解算法的思路轉換成代碼執(zhí)行算法的思路。
現(xiàn)在我來舉個例子,有這樣的一串數(shù)字,已經(jīng)排好序了,如何能寫一段二分查找代碼找到35這個數(shù)字呢?