036 Valid Sudoku
Determine if a 9x9 Sudoku board is valid. Only the filled cells need to be validated according to the following rules:
Each row must contain the digits1-9
without repetition.
Each column must contain the digits1-9
without repetition.
Each of the 93x3
sub-boxes of the grid must contain the digits1-9
without repetition.
The Sudoku board could be partially filled, where empty cells are filled with the character'.'
.
Example:
Input:
[
["5","3",".",".","7",".",".",".","."],
["6",".",".","1","9","5",".",".","."],
[".","9","8",".",".",".",".","6","."],
["8",".",".",".","6",".",".",".","3"],
["4",".",".","8",".","3",".",".","1"],
["7",".",".",".","2",".",".",".","6"],
[".","6",".",".",".",".","2","8","."],
[".",".",".","4","1","9",".",".","5"],
[".",".",".",".","8",".",".","7","9"]
]
Output: true
Input:
[
["8","3",".",".","7",".",".",".","."],
["6",".",".","1","9","5",".",".","."],
[".","9","8",".",".",".",".","6","."],
["8",".",".",".","6",".",".",".","3"],
["4",".",".","8",".","3",".",".","1"],
["7",".",".",".","2",".",".",".","6"],
[".","6",".",".",".",".","2","8","."],
[".",".",".","4","1","9",".",".","5"],
[".",".",".",".","8",".",".","7","9"]
]
Output: false
Explanation: Same as Example 1, except with the 5 in the top left corner being
modified to 8. Since there are two 8's in the top left 3x3 sub-box, it is invalid.
Note:
A Sudoku board (partially filled) could be valid but is not necessarily solvable.
Only the filled cells need to be validated according to the mentioned rules.
The given board contain only digits1-9
and the character'.'
.
The given board size is always9x9
.
解釋下題目:
按照它所給的三個條件一一去確認即可。
1. 按行按列按塊進行查詢
實際耗時:35ms
public boolean isValidSudoku(char[][] board) {
//按列檢查
for (int i = 0; i < 9; i++) {
List<Character> list = new ArrayList<>();
for (int j = 0; j < 9; j++) {
if (list.contains(board[i][j])) {
return false;
} else if (isNumber(board[i][j])) {
list.add(board[i][j]);
}
}
}
//按行檢查
for (int j = 0; j < 9; j++) {
List<Character> list = new ArrayList<>();
for (int i = 0; i < 9; i++) {
if (list.contains(board[i][j])) {
return false;
} else if (isNumber(board[i][j])) {
list.add(board[i][j]);
}
}
}
for (int k = 0; k < 3; k++) {
List<Character> list = new ArrayList<>();
for (int i = 3 * k; i < 3 * k + 3; i++) {
for (int j = 0; j < 3; j++) {
if (list.contains(board[i][j])) {
return false;
} else if (isNumber(board[i][j])) {
list.add(board[i][j]);
}
}
}
list.clear();
for (int i = 3 * k; i < 3 * k + 3; i++) {
for (int j = 3; j < 6; j++) {
if (list.contains(board[i][j])) {
return false;
} else if (isNumber(board[i][j])) {
list.add(board[i][j]);
}
}
}
list.clear();
for (int i = 3 * k; i < 3 * k + 3; i++) {
for (int j = 6; j < 9; j++) {
if (list.contains(board[i][j])) {
return false;
} else if (isNumber(board[i][j])) {
list.add(board[i][j]);
}
}
}
}
return true;
}
public static boolean isNumber(char a) {
if (a - '0' >= 0 && a - '0' <= 9) {
return true;
}
return false;
}
主要就是利用了list的contain來判斷有沒有重複
時間複雜度O(3*n^2)
空間複雜度O(1)
2. 少寫點程式碼唄
實際耗時:30ms
public boolean isValidSudoku2(char[][] board) {
for (int i = 0; i < 9; i++) {
HashSet<Character> rows = new HashSet<Character>();
HashSet<Character> columns = new HashSet<Character>();
HashSet<Character> cube = new HashSet<Character>();
for (int j = 0; j < 9; j++) {
if (board[i][j] != '.' && !rows.add(board[i][j]))
return false;
if (board[j][i] != '.' && !columns.add(board[j][i]))
return false;
int RowIndex = 3 * (i / 3);
int ColIndex = 3 * (i % 3);
if (board[RowIndex + j / 3][ColIndex + j % 3] != '.' && !cube.add(board[RowIndex + j / 3][ColIndex + j % 3]))
return false;
}
}
return true;
}
他巧妙的地方在於對於3x3
的塊的處理。
時間複雜度O(3*n^2)
空間複雜度O(1)
相關文章
- Leetcode 36 Valid SudokuLeetCode
- Leetcode 37 Sudoku SolverLeetCode
- sudoku 數獨 XY-ChainsAI
- 036、關山月
- spring - mvc - @ValidSpringMVC
- Longest Valid Parentheses
- 125. Valid Palindrome
- Leetcode 20 Valid ParenthesesLeetCode
- 65-Valid Number
- [ABC036D] 塗り絵 題解
- L2-036 網紅點打卡攻略
- ROTEK S036-L_50-W0250-01
- gipchaLowerProcessNode: no valid interfaces found to node
- Please provide a valid cache pathIDE
- 941. Valid Mountain ArrayAI
- await is only valid in async functionAIFunction
- Leetcode 32 Longest Valid ParenthesesLeetCode
- CSS :valid 選擇器CSS
- InnoDB: No valid checkpoint found.
- fatal: Not a valid object name: 'master'ObjectAST
- Flutter基礎-036-事件匯流排EventBusFlutter事件
- @Valid和@Validated的區別
- @Valid 與 @Validated 的區別
- Caused by: Error: ' ' is not a valid resource name characterError
- A valid provisioning profile for this executable was not found.
- Leetcode 611 javascript Valid Triangle NumberLeetCodeJavaScript
- [LeetCode] 678. Valid Parenthesis StringLeetCode
- [LeetCode] 32. Longest Valid ParenthesesLeetCode
- 036.Vue3入門,元件的生命週期Vue元件
- Java中@Valid子物件註釋Java物件
- openssl_private_encrypt(): key param is not a valid
- LeetCode Valid Parentheses(020)解法總結LeetCode
- leetcode 593. Valid Square練習LeetCode
- leetcode 593. Valid Square 練習LeetCode
- Docker 警告 Plugin XXX is not valid: failed to fetch metadataDockerPluginAI
- 036 Rust死靈書之Vec的完整程式碼測試Rust
- valid/ready握手機制及verilog程式碼
- 報錯“Please indicate a valid Swagger or OpenAPI version field”SwaggerAPI