周二進行了ms的面試,一面的第二題沒有做出來,當時和面試官說了,回來好好想想,然後把思路貼在部落格上,雖然面試官高可能也不會來看。但是還是自己總結一下吧!題目和leetcode85一樣,有兩種思路。
第一種思路
也就是走之前面試官提示的思路。基於largest rectangle in histogram假設把矩陣沿著某一行分開,然後把分開的行作為底面,將自底面往上的矩陣看成乙個直方圖(histogram)。直方圖的中每個項的高度就是從底面行開始往上1的數量。根據largest rectangle in histogram就可以求出當前行作為矩陣下邊緣的乙個最大矩陣。接下來如果對每一行都做一次largest rectangle in histogram,從其中選出最大的矩陣,那麼它就是整個矩陣中面積最大的子矩陣。
第二種思路
採用動態規劃的思想。從第一行開始一行一行地處理,使[i, j]處最大子矩陣的面積是(right(i, j)-left(i, j))*height(i, j)。其中height統計當前位置及往上』1』的數量;left和right是高度是當前點的height值得左右邊界,即是以當前點為中心,以height為高度向兩邊擴散的左右邊界。
遞推公式如下:
left(i, j) = max(left(i-1, j), cur_left);
right(i, j) = min(right(i-1, j), cur_right);
height(i, j) = height(i-1, j) + 1, if matrix[i][j]=='1';
height(i, j) = 0, if matrix[i][j]==』0』.
其中cur_left和cur_right的值由當前行決定,如果當前位置是』1』,則cur_left和cur_right都不變;如果當前位置是』0』,則cur_left就為當前位置的右側,cur_right就為當前位置。
解題思路 leetcode第二題 兩數相加
題目描述 給出兩個非空的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照逆序的方式儲存的,並且它們的每個節點只能儲存 一位 數字。如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。示例 輸入 2 4 3 5 6 4 輸出...
迴旋矩陣演算法題解題思路
原帖見 深圳一家公司面試問題,很囧 題目要求列印乙個迴旋數字矩陣 int i 5 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9 int i 6 1 2 3 4 5 6 20 21 22 23 24 7 19 32 ...
揹包問題解題思路
這個問題解決起來也不是很難,在這裡,我們設定一組資料供以測試,int v 初始化物品價值陣列 int w 初始化物品重量陣列 先嘗試盡量裝又小又值錢的東西,再嘗試第二的 由此反覆,裝不下時,在實行動態轉移方程 for int i 1 i n i else 至此,大框架算是完成了,接下來顯出完整 in...