講座嘉賓:Stevenode
講座連接:ACM大神精講最新北美Google Facebook面試題面試
講座總結:6Kunnnnn算法
題目介紹編程
其實這道題目就是五子棋的規則,條件就是橫豎或者對角線知足5個一樣棋子,很好理解。數組
題目分析數據結構
首先,咱們能想到的就是暴力枚舉法,也就是枚舉棋盤上各個棋子,判斷是否可以知足條件。每一個棋子有8個方向,可是咱們須要除去冗餘的枚舉,只考慮4個方向就行了。以下圖:ide
那麼,咱們須要一個數組處理方向,以下圖,其中d(k)就是用來表達方向的數組,注:下圖中 d(2) = (1, -1) 應該爲 d(3) - (1, -1) 即lower-left的方向post
那麼給定點(x, y),和方向(dx[k], dy[k]),在這個方向上的第N個棋子就是 (x + dx[k] * N, y + dy[k] * N),以下圖:學習
如今有了知道一個棋子某個方向上某個點的位置的方法,咱們就能夠判斷對於任意棋子的4個方向上,是否有知足條件的狀況。對於最後的輸出結果,咱們要判斷對於黑白兩種棋子,是否分別存在知足條件的狀況。以下圖:優化
因此總結起來,咱們須要枚舉每一個棋子的四個方向上,每個可能位置,並檢查是否成立,這個算法的複雜度是N方,由於須要對每個棋子都進行判斷。以下圖:
代碼實現
以下圖,valid(x, y) 判斷棋子位置是否合法,也就是不能超過棋盤的範圍,好比這道題目中棋盤長和寬都是15。
算法優化
如上圖,暴力解法雖然直白,可是複雜度不盡人意。好比若是不是五子棋,而是M子棋,時間複雜度就會變大。如何優化呢?首先要了解暴力解法的弊端是什麼:簡單來講,就是存在有些棋子被重複判斷的狀況。而有一種更好方法是,從各個方向上判斷是否存在某一顏色的棋子成立M行的狀況。以下圖,咱們假定仍是五子棋的狀況,即M=5,給定某個點的座標(x, y),方法Black(x, y)用來判斷從(x, y)這個點對於橫行向右的方向上,連續黑色棋子的個數,具體實現以下圖,是經過遞歸來完成,isBlack(x, y)用來判斷(x, y) 座標是否爲黑子,是則返回1不然0。同理White和isWhite方法。
該算法的實現以下圖:Step1,枚舉每個方向,而不是棋子自己;Step2,逆向枚舉每一個方向上的棋子,即x和y都是從N到1;Step3,用遞歸的方法來計算某個方向上的不一樣顏色的棋子個數;Step4,只有這步和以前的暴力解法同樣,判斷最終的結果。算法最終複雜度爲N方,不涉及M的參與。
題目介紹
給出一個最小堆的中序遍歷,來生成這個最小堆,而且輸出它的前序遍歷的結果。輸入就是,一個Int數組來存儲中序遍歷最小堆的結果,好比7 6 8 1 3 11,輸出就是打印出這個最小堆的前序遍歷,就是1 6 7 8 3 11。
題目分析
先來回顧一下Heap的性質。Heap在結構上是一個二叉樹,所謂的最小堆Min-Heap,就是指從root節點開始,parent節點的值永遠小於child節點。既然Heap是一種樹,那麼固然存在各類順序的遍歷traversal。總的來講,不管是In-Order仍是Pre/Post-Order,這裏的Order對應的是root/parent節點的Order,好比中序遍歷是指先left-subtree,而後root,最後right-subtree。
既然root節點的值確定比其餘節點要小,也就是這個數組中的最小值1。以後,根據中序遍歷的規律,root的左子樹在root前邊先被遍歷,右子樹則恰好相反。那咱們知道了root節點爲1後,就能夠判斷,在1前邊就是這個堆的左子樹,後邊的就是右子樹。以下圖:
這道題目是一道遞歸題,考查的是分治思想Divide & Conquer,就是把以前的大問題,轉化成若干性質相同的小問題,而後找到小問題的答案,最後將答案合併到一塊兒就是大問題的答案。對於此題,最初的大問題就是最開始的input 7 6 8 1 3 11,而咱們上邊所講的,先找到root,再找到左右子樹,而後對左右子樹遞歸,這裏「左右子樹分別遞歸」就是被分解成的小問題。因此對於此題,咱們能夠分解爲三個步驟,以下圖:
那麼這種算法的時間複雜度是多少?首先,對於分治思想,一個很重要的概念就是層Level,能夠理解爲是將大問題分解成小問題所須要的次數,等價於樹的高度Height,而對於樹Tree來講,高度是一個很重要的性質。因此對於此算法,咱們須要考慮將大問題分解成小問題的層數,也要考慮每一層的計算次數。以下圖:
假定輸入裏有N個元素的話,對於每一層來講,都須要找到最小node,這須要O(N)的複雜度。對於層數,平均狀況是logN層,就是這個樹是左右對稱的。而最壞狀況是N層,就是這個Tree實際上是一個chain,好比下圖:
代碼實現
算法優化
其實對於這個題目,咱們能夠避免建立Min-Heap,而是直接把結果打印出來,以下圖:
而如何避免最壞狀況的發生?能夠用RMQ,Range Minimum Query這個數據結構。感興趣的同窗能夠自學一下。
這是一道DP的題目,頗有難度,歡迎各位去觀看原視頻內容!
設立於硅谷,專一於編程、數據分析、UIUX設計的在線學習平臺:BitTiger。