LeetCode演算法題-Image Smoother(Java實現)
這是悅樂書的第282 次更新,第299 篇原創
01 看題和準備
今天介紹的是LeetCode演算法題中Easy級別的第150題(順位題號是661)。給定表示影象灰度的2D整數矩陣M,您需要設計一個平滑器以使每個單元的灰度變為所有8個周圍單元及其自身的平均灰度(向下舍入)。如果一個單元的周圍單元少於8個,那麼儘可能多地使用單元。例如:
輸入:[[1,1,1],[1,0,1][1,1,1]]
輸出:[[0,0,0],[0,0,0],[0,0,0]]
說明:
對於點(0,0),(0,2),(2,0),(2,2):floor(3/4)= floor(0.75)= 0
對於點(0,1),(1,0),(1,2),(2,1):floor(5/6)= floor(0.83333333)= 0
對於點(1,1):floor(8/9)= floor(0.88888889)= 0
注意:
-
給定矩陣中的值在[0,255]的範圍內。
-
給定矩陣的長度和寬度在[1,150]的範圍內。
本次解題使用的開發工具是eclipse,jdk使用的版本是1.8,環境是win7 64位系統,使用Java語言編寫和測試。
02 解題
題目的意思是根據給定的二維陣列,將其周圍的相鄰元素和其自身的值加起來算平均值,一次計算最多是9個單元格(包含自身)。題目所給的那個示例,M[0][0]這個元素只用算4個單元格元素的平均值即可,因為另外幾個都是邊界。所以,根據題目的意思,直接翻譯過來就行,外面兩層迴圈控制當前取哪個點展開計算,內層兩層迴圈控制當前這個點需要計算周圍那些相鄰的單元格,算完平均值後,重新賦值即可。
public int[][] imageSmoother(int[][] M) { if (M == null || M.length == 0 || M[0].length == 0) { return M; } int row = M.length, col = M[0].length; int[][] result = new int[row][col]; for (int i=0; i<row; i++) { for (int j=0; j<col; j++) { int count = 0; int sum = result[i][j]; for (int k=i-1; k <= i+1; k++) { for (int h=j-1; h <= j+1; h++) { if (0 <= k && k < row && 0 <= h && h <col) { sum += M[k][h]; count++; } } } result[i][j] = sum/count; } } return result; }
03 小結
演算法專題目前已日更超過四個月 ,演算法題文章150 +篇,公眾號對話方塊回覆【資料結構與演算法 】、【演算法 】、【資料結構 】中的任一關鍵詞,獲取系列文章合集。
以上就是全部內容,如果大家有什麼好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支援!