这是悦乐书的第 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 + 篇, 公众号对话框回复[数据结构与算法] ,[算法] ,[数据结构] 中的任一关键词, 获取系列文章合集.
以上就是全部内容, 如果大家有什么好的解法思路, 建议或者其他问题, 可以下方留言交流, 点赞, 留言, 转发就是对我最大的回报和支持!
来源: http://www.jianshu.com/p/1dbddc4301ab