有效的数独(medium)
做题过程
肯定就是数学的分类讨论和规律推导,和算法关系不大。
算法概述
原题
本题要求为判断数独是否有效(后效条件为矩阵内1-9只能出现一次、每行每列内1-9只能出现一次)
- 时间复杂度为O(1):给定了81
- 空间复杂度为O(1)
JAVA
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| class Solution { public boolean isValidSudoku(char[][] board) { int[][] rows = new int[9][9]; int[][] columns = new int[9][9]; int[][][] subboxes = new int[3][3][9]; for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { char c = board[i][j]; if (c != '.') { int index = c - '0' - 1; rows[i][index]++; columns[j][index]++; subboxes[i / 3][j / 3][index]++; if (rows[i][index] > 1 || columns[j][index] > 1 || subboxes[i / 3][j / 3][index] > 1) { return false; } } } } return true; } }
|
总结
就是按照要求准备三个标记数组,每次都记录频次,只要大于1就不行。
生命游戏(medium)
做题过程
一看要求就是一样的标记数组和判断,不会写,懒得写。
算法概述
原题
本题要求为判断细胞下一阶段生命状态。
规则如下
JAVA
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 49 50 51
| class Solution { public void gameOfLife(int[][] board) { int[] neighbors = {0, 1, -1};
int rows = board.length; int cols = board[0].length;
int[][] copyBoard = new int[rows][cols];
for (int row = 0; row < rows; row++) { for (int col = 0; col < cols; col++) { copyBoard[row][col] = board[row][col]; } }
for (int row = 0; row < rows; row++) { for (int col = 0; col < cols; col++) {
int liveNeighbors = 0;
for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) {
if (!(neighbors[i] == 0 && neighbors[j] == 0)) { int r = (row + neighbors[i]); int c = (col + neighbors[j]);
if ((r < rows && r >= 0) && (c < cols && c >= 0) && (copyBoard[r][c] == 1)) { liveNeighbors += 1; } } } }
if ((copyBoard[row][col] == 1) && (liveNeighbors < 2 || liveNeighbors > 3)) { board[row][col] = 0; } if (copyBoard[row][col] == 0 && liveNeighbors == 3) { board[row][col] = 1; } } } } }
|
总结
感觉应该不太会考,毕竟怎么写也用不到算法。