661. Image Smoother

原題

  • 題目描述:給你一個二維數組,每個元素的值要你按照以他爲中心的8個值外加自己的值求平均值,並填在元素位置上,其中有些位置沒有8個鄰居,那麼就找出儘可能多的鄰居算平局值(包括自身),按照這個方法最終返回新矩陣
  • 思路:
    1. 先寫一個判斷數組下標是否越界的函數
    2. 然後,遍歷數組時,每個位置i,j,按照i和j分別上下左右共8個方向偏移,對每次偏移判斷是否越界,由此可找出有效鄰居的個數,總和,最終得到平均值
    3. 此代碼在處理8個方向及包含自己的9個位置時運用的兩個for循環解決,簡直不要太完美!一點也沒拖泥帶水,漲知識了!!
class Solution {
    public int[][] imageSmoother(int[][] M) {
        int rows=M.length;
        int cols=M[0].length;
        int[][] res=new int[rows][cols];
        for(int i=0;i<rows;i++){
            for(int j=0;j<cols;j++){//遍歷矩陣
               res[i][j]=getElem(i,j,rows,cols,M);//計算每個位置的灰度
            }
        }
        return res;
    }

    public static int getElem(int i,int j,int rows,int cols,int[][] M){//計算灰度方法
        int count=0;
        int sum=0;
        int[] move={-1,0,1};//行和列的移動步子(這兩個for循環可以說讓程序變得異常乾淨)
        for(int rowMove : move){
            for(int colMove : move){
                if(isVaild(i+rowMove,j+colMove,rows,cols)){//若行和列的移動不會導致數組越界
                    count++;//則這是有效鄰居
                    sum+=M[i+rowMove][j+colMove];//累加加上有效鄰居的數值
                }
            }
        }
        return sum/count;//M[i][j]位置上的灰度
    }

    public static boolean isVaild(int i,int j,int row,int col){//判斷(i,j)位置是否越界
            return i>=0&&i<row&&j>=0&&j<col;
    }

}
發佈了80 篇原創文章 · 獲贊 35 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章