1、 手寫二叉搜索樹的插入、刪除
沒寫過,刪除操作完全寫錯了。
2、輸入流的頻率TOPk問題,引出堆的實現
我先實現了算法導論中自頂向下的維護堆的函數MAX_HEAPIFY()。
面試官說不好,應該寫個自底向上的、、、、、、、、、、、、、、、、、、、他可能把MAX_HEAPIFY()維護堆理解成了HEAP_INCREACE_KEY()維護堆。
然後過,下一題。
3、給定一個M*N的棋盤,給定一個出發點,終點。只能走”日”,即馬走日。判斷能否到達終點。
我寫了個廣度優先搜索路徑的算法
面試官想了半天,說可能不對:已經遍歷的點,不會再入隊列,所以某個點如果要走兩遍的話會出問題。
當時沒堅持。回來想想,這種情況根本就是扯淡。
面試官說正確解法是動態規劃。
神TM動態規劃,就是從k步能到達的點推導出k+1步能到達的所有點!沒有新增的可達點時退出迭代。
重複計算太多,還不如尋路算法快。
4、求兩個相同大小的有序數組的中位數。
當時想了個兩個指針同時遍歷,類似歸併的思路。O(n)
然後,面試官說能不能更快
我說二分查找?
他沒回答我,感覺面試官沒興趣了,我就沒繼續往下想了
我回來想了個方法:
由於兩個指針的位置是相互有關係
大概就是:index1+index2 == n這種
可以二分查找其中一個指針位置,另一個指針位置使用上述關係得到。判斷兩個指針的值是否相同或者相鄰即可。
標準解法是分治思想:http://www.acmerblog.com/median-of-two-sorted-arrays-5967.html