昨天參加了美團的校園招聘筆試,大部分是演算法設計題,所以打算總結一下演算法設計的步驟。
其中又一道題目是這樣的:「有乙個mxn的矩陣,每一行從左到右是公升序的,每一列從上到下是公升序的。請實現乙個函式,在矩陣中查詢元素elem,找到則返回elem的位置。」題設只說了行和列是公升序的,我在草稿紙上畫了乙個3x4的矩陣,裡面的元素是1~12,於是我就想當然的認為矩陣的左上角是最小的元素,右下角是最大的元素。於是整個題目的思考方向就錯了。
繼續以上面的題目為例子。可以有如下幾種演算法:
a. 遍歷整個矩陣進行查詢,那麼複雜度為o(m*n);
b. 因為每一行是有序的,所以可以對每一行進行二分查詢,複雜度為o(m*logn)。但是這樣只用到了行有序的性質。
c. 網上查了一下,最優的演算法是從矩陣的左下角開始,比較左下角的元素(假設為x)與elem的大小,如果elem比x大,那麼x所在的那一列元素就都被排除了,因為x是該列中最大的了,比x還大,那麼肯定比x上面的都大;如果elem比x小,那麼x所在的那一行就可以排除了,因為x是這一行裡最小的了,比x還小那麼肯定比x右邊的都小。每迭代一次,矩陣的尺寸就縮小一行或一列。複雜度為o(max(m,n))。
可以先從複雜度較高的實現方法入手,然後再考慮如何利用題目的特定條件來降低複雜度。
面試總結 演算法篇
leetcode是經同學介紹的 據說有很大一部分演算法面試題都在leetcode的題庫中,甚至是完全一樣,既然想好要學點什麼就要一點點慢慢的啃吧。題目涉及別家 版權,就不在這裡說什麼了,本來還想每日一刷讓大家幫忙做個監督,估計不太合適了。為了更好的自己,加油!用了三天左右空餘時間,把sql簡單刷了一...
面試總結 演算法相關
設定雙指標,間距為k,順序後移,當right至末尾,left指向倒數第k個元素。使用快慢指標的方法,一定步數後,兩個指標會相遇。思路,建乙個棧存放單鏈表的偶數字。採用歸併方法,合併兩個有序集合。棧 單鏈表奇數字 設定兩個陣列,第乙個陣列a1放置26個字母。a1 a b z 第二個陣列a2放置a1的個...
LeetCode習題總結 演算法(5)
首先先上原題 通過給定對應七種羅馬數字對應的七種字元 i,v,x,l,c,d 和 m 以及對應七種字元所對應的數值 i 1,v 5,x 10,l 50,c 100,d 500,m 1000。去求解在給定乙個羅馬字串時,對應的羅馬數字表示為多少。思路 基於此題目,我們可以發現對應的羅馬字元和羅馬數字之...