1. 程式人生 > 其它 >[編號][0][刷題][LeetCode][簡單][661.圖片平滑器]

[編號][0][刷題][LeetCode][簡單][661.圖片平滑器]

影象平滑器 是大小為 3 x 3 的過濾器,用於對影象的每個單元格平滑處理,平滑處理後單元格的值為該單元格的平均灰度。

每個單元格的  平均灰度 定義為:該單元格自身及其周圍的 8 個單元格的平均值,結果需向下取整。(即,需要計算藍色平滑器中 9 個單元格的平均值)。

如果一個單元格周圍存在單元格缺失的情況,則計算平均灰度時不考慮缺失的單元格(即,需要計算紅色平滑器中 4 個單元格的平均值)。

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/image-smoother
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

 

我的最終程式碼:

最終程式碼
class Solution {
private:
    const int dir[8][2]={{-1,0},{1,0},{0,-1},{0,1},{-1,-1},{-1,1},{1,-1},{1,1}};
public:
    vector<vector<int>> imageSmoother(vector<vector<int>>& img) {
        int n=img.size();int m=img[0].size();
        vector<vector<int>> ans(n,vector<int
>(m)); for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { int val=img[i][j]; int num=9; for(int d=0;d<8;d++) { if(i+dir[d][0]>=0&&i+dir[d][0]<n&&j+dir[d][1
]>=0&&j+dir[d][1]<m) { val+=img[i+dir[d][0]][j+dir[d][1]]; } else num--; } ans[i][j]=val/num; } } return ans; } };

我的錯誤程式碼,及原因分析:

class Solution {
private:
    const int dir[8][2]={{-1,0},{1,0},{0,-1},{0,1},{-1,-1},{-1,1},{1,-1},{1,1}};
public:
    vector<vector<int>> imageSmoother(vector<vector<int>>& img) {
        int n=img.size();int m=img[0].size();
        vector<vector<int>> ans(n,vector<int>(m));
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                int val=img[i][j];
                int n=9;
                for(int d=0;d<8;d++)
                {
                    if(i+dir[d][0]>=0&&i+dir[d][0]<n&&j+dir[d][1]>=0&&j+dir[d][1]<m)
                    {
                        val+=img[i+dir[d][0]][j+dir[d][1]];
                    }
                    else {n--;}
                }
                ans[i][j]=val/n;
            }
        }
        return ans;
    }
};

//在這裡有錯誤,雖然小而傻但是要重視。
//錯誤間接因素1.習慣性用n,m定義高,寬,
//錯誤間接因素2.習慣性用n 定義當前計數;
//導致錯誤:n變數被定義兩次,但自己很難發現,部分編譯器甚至不報錯。
犯的錯誤

Leetcode官方解答程式碼:

class Solution {
public:
    vector<vector<int>> imageSmoother(vector<vector<int>>& img) {
        int m = img.size(), n = img[0].size();
        vector<vector<int>> ret(m, vector<int>(n));
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                int num = 0, sum = 0;
                for (int x = i - 1; x <= i + 1; x++) {
                    for (int y = j - 1; y <= j + 1; y++) {
                        if (x >= 0 && x < m && y >= 0 && y < n) {
                            num++;
                            sum += img[x][y];
                        }
                    }
                }
                ret[i][j] = sum / num;
            }
        }
        return ret;
    }
};

作者:LeetCode-Solution
連結:https://leetcode-cn.com/problems/image-smoother/solution/tu-pian-ping-hua-qi-by-leetcode-solution-9oi5/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
官方程式碼

 總結:定義變數謹防重複定義。

搜尋

複製