原地重置问题
根据特定的条件将数组变化,不用额外的空间
73. Set Matrix Zeroes
289. Game of Life
73. Set Matrix Zeroes
73. Set Matrix Zeroes
该题目是用第一行和第一列记录状态,然后其余部分根据第一行和第一列来改变
- 设置row和col来标记第一行和第一列是否需要改变
- 遍历其余部分,该位置为0,那么将该位置对应的第一行和第一列的值设置为0
- 根据第一行和第一列,只有其中有1个为0,就设置其值为0
- 根据第一步的row和col,来改变第一行和第一列
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| public void setZeroes(int[][] matrix) { int m = matrix.length; int n = matrix[0].length; // 设置row和col boolean col = false; boolean row = false; for (int i = 0; i < m; i++) { if (matrix[0][i] == 0) { col = true; break; } } for (int i = 0; i < n; i++) { if (matrix[i][0] == 0) { row = true; break; } } // 根据数组设置第一行第一列 for (int i = 1; i < m; i++) { for (int j = 1; j < n; j++) { if (matrix[i][j] == 0) { matrix[i][0] = 0; matrix[0][j] = 0; } } } // 根据第一行和第一列设置数组 for (int i = 1; i < m; i++) { for (int j = 1; j < n; j++) { if (matrix[i][0] == 0 || matrix[0][j] == 0) { matrix[i][j] = 0; } } } // 设置第一行和第一列 if (row) { for (int i = 0; i < m; i++) { matrix[i][0] = 0; } } if (col) { for (int i = 0; i < n; i++) { matrix[0][1] = 0; } } }
|
289. Game of Life
289. Game of Life
利用变色法来记录状态
1->0 == 2
0->1 == -1
统计个数是查看1(原来和现在都是1)和2(原来是1现在是0)个数
先更新成带变色的数组,然后再还原
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| public void gameOfLife(int[][] board) { //1->0 == 2 //0->1 == -1 //使用假色,1的个数=大于零的个数,因为可能有1->0 == 2 for(int i = 0; i < board.length; i++){ for(int j = 0; j < board[0].length; j++){ int k = f(board, i , j); if(board[i][j] == 1 && (k < 2 || k > 3)){ //1->0 == 2 board[i][j] = 2; }else if(board[i][j] == 0 && k == 3){ //0->1 == -1 board[i][j] = -1; } } } //恢复 for(int i = 0; i < board.length; i++){ for(int j = 0; j < board[0].length; j++){ if(board[i][j] == 2){ //1->0 == 2 board[i][j] = 0; }else if(board[i][j] == -1){ //0->1 == -1 board[i][j] = 1; } } } } //计算个数 public int f(int[][] x, int a, int b){ int cnt = 0; int[] k = {-1, 0, 1}; for(int i = 0; i < 3; i++){ int curi = a + k[i]; for(int j = 0; j < 3; j++){ int curj = b + k[j]; if(curi >= 0 && curj >= 0 && curi < x.length && curj < x[0].length && x[curi][curj] > 0 && !(k[i] == 0 && k[j] == 0)){ cnt++; } } } return cnt; }
|