算法刷题手记(2)
描述
给一个
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 }