題目連結:
題目意譯:
給定一個 m × n 的矩陣 mat 以及一整數 threshold,回傳有著總和小於等於 threshold 的正方形最大可能的邊長。如果不存在這樣子的正方形,則回傳 0。
限制:
m == mat.length
n == mat[i].length
1 ≦ m, n ≦ 300
0 ≦ mat[i][j] ≦ 10 ^ 4
0 ≦ threshold ≦ 10 ^ 5
範例測資:
範例 1:
輸入: mat = [[1,1,3,2,4,3,2],[1,1,3,2,4,3,2],[1,1,3,2,4,3,2]], threshold = 4
輸出: 2
解釋: 有著總和小於等於 4 的正方形最大可能的邊長,如圖所示,其值為 2。
範例 2:
輸入: mat = [[2,2,2,2,2],[2,2,2,2,2],[2,2,2,2,2],[2,2,2,2,2],[2,2,2,2,2]], threshold = 1
輸出: 0
解題思維:
利用
這題的想法(二維前綴和)搭配上對「答案」進行二分搜尋法(Binary Search)的方式(如這題)即可。
假設現在猜了一個邊長值 M,則我們掃過一次 mat 看哪些位置可以形成邊長 M 的正方形然後使用二維前綴和來計算出它們的總和。
如果所有正方形各自的總和都超過 threshold 的話,代表我們邊長猜得太大了,要猜小一點的值才行;反之,我們有機會可以猜更大的邊長值。
最後便可以收斂至一個可行且最大的邊長值。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。