解题过程
:::info
题目链接
图像平滑器 是大小为 3 x 3 的过滤器,用于对图像的每个单元格平滑处理,平滑处理后单元格的值为该单元格的平均灰度。
每个单元格的 平均灰度 定义为:该单元格自身及其周围的 8 个单元格的平均值,结果需向下取整。(即,需要计算蓝色平滑器中 9 个单元格的平均值)。
如果一个单元格周围存在单元格缺失的情况,则计算平均灰度时不考虑缺失的单元格(即,需要计算红色平滑器中 4 个单元格的平均值)。
给你一个表示图像灰度的 m x n 整数矩阵 img ,返回对图像的每个单元格平滑处理后的图像
:::
/**
* @link https://leetcode.cn/problems/image-smoother/
* @title 661. 图片平滑器
* @description 图像平滑器 是大小为 3 x 3 的过滤器,用于对图像的每个单元格平滑处理,平滑处理后单元格的值为该单元格的平均灰度。
* 每个单元格的 平均灰度 定义为:该单元格自身及其周围的 8 个单元格的平均值,结果需向下取整。(即,需要计算蓝色平滑器中 9 个单元格的平均值)。
* 如果一个单元格周围存在单元格缺失的情况,则计算平均灰度时不考虑缺失的单元格(即,需要计算红色平滑器中 4 个单元格的平均值
* 给你一个表示图像灰度的 m x n 整数矩阵 img ,返回对图像的每个单元格平滑处理后的图像
* @param {number[][]} img
* @return {number[][]}
*/
// 解法一:
// 思路:当想不到没有任何技巧的时候,最传统和基础的思路穷举每一项边界值判断,就是有点费时间,不过培养了一点耐心,不急不躁,一点一滴的写完了
var imageSmoother = function (img) {
const res = [] // 新返回值
const m = img.length // 矩阵长度m
for (let i = 0; i < img.length; i++) {
const n = img[i].length // 矩阵长度n
const nums = [] // 重新计算后的 img[i] 数组
for (let j = 0; j < img[i].length; j++) { // n
// 列出当前单元格周围的元素索引位置可能性
const num00 = i - 1 < 0 || j - 1 < 0 ? -1 : img[i - 1][j - 1]
const num01 = i - 1 < 0 ? -1 : img[i - 1][j]
const num02 = i - 1 < 0 || j + 1 >= n ? -1 : img[i - 1][j + 1]
const num10 = j - 1 < 0 ? -1 : img[i][j - 1]
const num12 = j + 1 >= n ? -1 : img[i][j + 1]
const num30 = i + 1 >= m || j - 1 < 0 ? -1 : img[i + 1][j - 1]
const num31 = i + 1 >= m ? -1 : img[i + 1][j]
const num32 = i + 1 >= m || j + 1 >= n ? -1 : img[i + 1][j + 1]
const numArr = [num00, num01, num02, num10, num12, num30, num31, num32]
const newNumArr = numArr.filter(item => item !== -1)
const numArrTotal = newNumArr.reduce((a, b) => a + b, 0)
const avg = Math.floor((img[i][j] + numArrTotal) / (newNumArr.length + 1))
nums.push(avg)
}
res.push(nums)
}
return res
}
// 解法二:
// 💡待补充...
// const result = imageSmoother([[1, 1, 1], [1, 0, 1], [1, 1, 1]]) // [[0, 0, 0],[0, 0, 0], [0, 0, 0]]
const result = imageSmoother([[100, 200, 100], [200, 50, 200], [100, 200, 100]]) // [[137,141,137],[141,138,141],[137,141,137]]
console.log(result)
解题感受
因为夜深了,脑子不好使了,也很困,所以一时间没有想到比较好的技巧解题,就用了传统思维穷举法来解决,等睡醒之后再慢慢优化一下解题技巧代码