解题过程

:::info 题目链接
图像平滑器 是大小为 3 x 3 的过滤器,用于对图像的每个单元格平滑处理,平滑处理后单元格的值为该单元格的平均灰度。

每个单元格的 平均灰度 定义为:该单元格自身及其周围的 8 个单元格的平均值,结果需向下取整。(即,需要计算蓝色平滑器中 9 个单元格的平均值)。

如果一个单元格周围存在单元格缺失的情况,则计算平均灰度时不考虑缺失的单元格(即,需要计算红色平滑器中 4 个单元格的平均值)。

image.png
给你一个表示图像灰度的 m x n 整数矩阵 img ,返回对图像的每个单元格平滑处理后的图像 :::

  1. /**
  2. * @link https://leetcode.cn/problems/image-smoother/
  3. * @title 661. 图片平滑器
  4. * @description 图像平滑器 是大小为 3 x 3 的过滤器,用于对图像的每个单元格平滑处理,平滑处理后单元格的值为该单元格的平均灰度。
  5. * 每个单元格的 平均灰度 定义为:该单元格自身及其周围的 8 个单元格的平均值,结果需向下取整。(即,需要计算蓝色平滑器中 9 个单元格的平均值)。
  6. * 如果一个单元格周围存在单元格缺失的情况,则计算平均灰度时不考虑缺失的单元格(即,需要计算红色平滑器中 4 个单元格的平均值
  7. * 给你一个表示图像灰度的 m x n 整数矩阵 img ,返回对图像的每个单元格平滑处理后的图像
  8. * @param {number[][]} img
  9. * @return {number[][]}
  10. */
  11. // 解法一:
  12. // 思路:当想不到没有任何技巧的时候,最传统和基础的思路穷举每一项边界值判断,就是有点费时间,不过培养了一点耐心,不急不躁,一点一滴的写完了
  13. var imageSmoother = function (img) {
  14. const res = [] // 新返回值
  15. const m = img.length // 矩阵长度m
  16. for (let i = 0; i < img.length; i++) {
  17. const n = img[i].length // 矩阵长度n
  18. const nums = [] // 重新计算后的 img[i] 数组
  19. for (let j = 0; j < img[i].length; j++) { // n
  20. // 列出当前单元格周围的元素索引位置可能性
  21. const num00 = i - 1 < 0 || j - 1 < 0 ? -1 : img[i - 1][j - 1]
  22. const num01 = i - 1 < 0 ? -1 : img[i - 1][j]
  23. const num02 = i - 1 < 0 || j + 1 >= n ? -1 : img[i - 1][j + 1]
  24. const num10 = j - 1 < 0 ? -1 : img[i][j - 1]
  25. const num12 = j + 1 >= n ? -1 : img[i][j + 1]
  26. const num30 = i + 1 >= m || j - 1 < 0 ? -1 : img[i + 1][j - 1]
  27. const num31 = i + 1 >= m ? -1 : img[i + 1][j]
  28. const num32 = i + 1 >= m || j + 1 >= n ? -1 : img[i + 1][j + 1]
  29. const numArr = [num00, num01, num02, num10, num12, num30, num31, num32]
  30. const newNumArr = numArr.filter(item => item !== -1)
  31. const numArrTotal = newNumArr.reduce((a, b) => a + b, 0)
  32. const avg = Math.floor((img[i][j] + numArrTotal) / (newNumArr.length + 1))
  33. nums.push(avg)
  34. }
  35. res.push(nums)
  36. }
  37. return res
  38. }
  39. // 解法二:
  40. // 💡待补充...
  41. // const result = imageSmoother([[1, 1, 1], [1, 0, 1], [1, 1, 1]]) // [[0, 0, 0],[0, 0, 0], [0, 0, 0]]
  42. const result = imageSmoother([[100, 200, 100], [200, 50, 200], [100, 200, 100]]) // [[137,141,137],[141,138,141],[137,141,137]]
  43. console.log(result)

解题感受

因为夜深了,脑子不好使了,也很困,所以一时间没有想到比较好的技巧解题,就用了传统思维穷举法来解决,等睡醒之后再慢慢优化一下解题技巧代码

参考题解