661. 图片平滑器
题目
图像平滑器 是大小为 3 x 3 的过滤器,用于对图像的每个单元格平滑处理,平滑处理后单元格的值为该单元格的平均灰度。
每个单元格的 平均灰度 定义为:该单元格自身及其周围的 8 个单元格的平均值,结果需向下取整。(即,需要计算蓝色平滑器中 9 个单元格的平均值)。
如果一个单元格周围存在单元格缺失的情况,则计算平均灰度时不考虑缺失的单元格(即,需要计算红色平滑器中 4 个单元格的平均值)。
代码
class Solution {
public int[][] imageSmoother(int[][] img) {
int m=img.length, n=img[0].length;
int[][] res=new int[m][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];
}
}
}
res[i][j]=sum/num;
}
}
return res;
}
}
思考
这是简单题,我本来也觉得是简单题。然后我就二重遍历,考虑所有情况,直接if else分类讨论计算。然而,我只考虑到m>1,n>1的情况,直接死在了[[1]]这个测试用例,┭┮﹏┭┮。所有还是有必要记录一下。
二重循环中,套一个二重循环来判断周围单元格是否存在。
这样写代码即使卷积核维度变了,代码也不用大改。
419. 甲板上的战舰
题目
给你一个大小为 m x n 的矩阵 board 表示甲板,其中,每个单元格可以是一艘战舰 ‘X’ 或者是一个空位 ‘.’ ,返回在甲板 board 上放置的 战舰 的数量。
战舰 只能水平或者垂直放置在 board 上。换句话说,战舰只能按 1 x k(1 行,k 列)或 k x 1(k 行,1 列)的形状建造,其中 k 可以是任意大小。两艘战舰之间至少有一个水平或垂直的空位分隔 (即没有相邻的战舰)。
代码
class Solution {
public int countBattleships(char[][] board) {
int m=board.length,n=board[0].length;
int num=0;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(board[i][j]=='X'){
if(i>0 && board[i-1][j]=='X')
continue;
if(j>0 && board[i][j-1]=='X')
continue;
num++;
}
}
}
return num;
}
}
思考
其实我题目也没看懂,现在也没看明白。
看了答案,也没看懂题目。
官解二,稍稍明白点,遇到x,判断x是否满足当成左上起点,满足就num++。
但是这在哪里判断了两艘战舰之间至少有一个水平或垂直的空位分隔。又或者这句话啥意思啊?