zl程序教程

您现在的位置是:首页 >  其他

当前栏目

算法刷题手记(2)

2023-03-20 14:48:11 时间

描述

给一个n*m大小的矩阵,寻找矩阵中所有比邻居(上下左右,对角也算,不考虑边界,即8个)都严格大的点。
返回一个n*m大小的矩阵,如果原矩阵中的点比邻居都严格大,则该位置为1,反之为0

 

 1 public int[][] highpoints(int[][] grid) {
 2         // write your code here
 3         /**
 4          * 创建一个同样规格的数组
 5          */
 6         int[][] ints = new int[grid.length][grid[0].length];
 7         /**
 8          * 循环遍历数组,目的:为了判断每个位置是否比周围都大
 9          */
10         for (int i = 0; i < grid.length; i++) {
11             /**
12              * 创建一个集合存储 当前遍历元素 判断范围的横坐标(比如:判断[2,2] 位置是否符合条件 集合中存储的横坐标范围是(1,2,3)),下面集合同理存储纵坐标范围
13              */
14             ArrayList<Integer> abscissas = new ArrayList<>();
15             abscissas.add(i - 1);
16             abscissas.add(i);
17             abscissas.add(i + 1);
18             for (int j = 0; j < grid[i].length; j++) {
19                 Boolean flag = true;
20                 ArrayList<Integer> ordinates = new ArrayList<>();
21                 ordinates.add(j - 1);
22                 ordinates.add(j);
23                 ordinates.add(j + 1);
24 
25                 /**
26                  * 取出横坐标和增坐标进行组合,9种组合(其中一种代表的是对比的本体 需要排除,自己跟自己不用比,8个是被对比元素)
27                  */
28                 outer:
29                 for (int x = 0; x < abscissas.size(); x++) {
30                     /**
31                      * 如果横坐标越界 直接结束,
32                      */
33                     if (abscissas.get(x) < 0 || abscissas.get(x) > grid[0].length - 1) {
34                         continue outer;
35                     }
36                     inner:
37                     for (int y = 0; y < ordinates.size(); y++) {
38                         /**
39                          * 判断3个维度:1、纵坐标是否越界  2、当前组合是否是要对比的本体,如果是就要排除  3、判断对比本体是否小于周围元素,如果不小于则置flag=false,如果都大于则flag不变为true
40                          */
41                         if (ordinates.get(y) >= 0 && ordinates.get(y) < grid.length && !(abscissas.get(x) == i && ordinates.get(y) == j) && grid[i][j] <= grid[abscissas.get(x)][ordinates.get(y)]) {
42                             flag = false;
43                             break outer;
44                         }
45                     }
46                 }
47                 /**
48                  * 如果判断完后,flag仍未true,则将待返回数组的当前位置置为1,否则置为0
49                  */
50                 if (flag) {
51                     ints[i][j] = 1;
52                 } else {
53                     ints[i][j] = 0;
54                 }
55             }
56         }
57         return ints;
58     }