1. 程式人生 > 其它 >演算法刷題手記(2)

演算法刷題手記(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 }