王廷瑋|數位醫療|智慧醫療: 36. Valid Sudoku WFU

2024年7月3日 星期三

36. Valid Sudoku

36. Valid Sudoku


判斷一個 9 x 9 的數獨棋盤是否有效。只需要根據以下規則驗證填滿的單元格:

每一行必須包含 1-9 的數字,且不能重複。 每一列必須包含 1-9 的數字,且不能重複。 網格中的每一個 3 x 3 的子框必須包含 1-9 的數字,且不能重複。 注意:

一個數獨棋盤(部分填滿)可能是有效的,但不一定可解。 只需要驗證已填滿的單元格,並且根據上述規則進行驗證。


Python


from typing import List

class Solution:
def isValidSudoku(self, board: List[List[str]]) -> bool:
def is_valid_group(group: List[str]) -> bool:
elements = [num for num in group if num != '.']
return len(elements) == len(set(elements))
# Check rows
for row in board:
if not is_valid_group(row):
return False
# Check columns
for col in range(9):
if not is_valid_group([board[row][col] for row in range(9)]):
return False
# Check 3x3 sub-boxes
for box_row in range(3):
for box_col in range(3):
if not is_valid_group([
board[r][c]
for r in range(box_row * 3, (box_row + 1) * 3)
for c in range(box_col * 3, (box_col + 1) * 3)
]):
return False
return True

16.46MB, 89ms


C++


#include <vector>
#include <unordered_set>

using namespace std;

class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
// Helper lambdas to validate rows, columns, and sub-boxes
auto is_valid_group = [](const vector<char>& group) {
unordered_set<char> seen;
for (char num : group) {
if (num != '.') {
if (seen.count(num)) {
return false;
}
seen.insert(num);
}
}
return true;
};
// Check rows
for (const auto& row : board) {
if (!is_valid_group(row)) {
return false;
}
}
// Check columns
for (int col = 0; col < 9; ++col) {
vector<char> column;
for (int row = 0; row < 9; ++row) {
column.push_back(board[row][col]);
}
if (!is_valid_group(column)) {
return false;
}
}
// Check 3x3 sub-boxes
for (int box_row = 0; box_row < 3; ++box_row) {
for (int box_col = 0; box_col < 3; ++box_col) {
vector<char> box;
for (int r = box_row * 3; r < (box_row + 1) * 3; ++r) {
for (int c = box_col * 3; c < (box_col + 1) * 3; ++c) {
box.push_back(board[r][c]);
}
}
if (!is_valid_group(box)) {
return false;
}
}
}
return true;
}
};

25.45MB, 19ms


Javascript


/**
* @param {character[][]} board
* @return {boolean}
*/
var isValidSudoku = function(board) {
const isValidGroup = (group) => {
const seen = new Set();
for (let num of group) {
if (num !== '.') {
if (seen.has(num)) {
return false;
}
seen.add(num);
}
}
return true;
};

// Check rows
for (let row = 0; row < 9; row++) {
if (!isValidGroup(board[row])) {
return false;
}
}

// Check columns
for (let col = 0; col < 9; col++) {
const column = [];
for (let row = 0; row < 9; row++) {
column.push(board[row][col]);
}
if (!isValidGroup(column)) {
return false;
}
}

// Check 3x3 sub-boxes
for (let boxRow = 0; boxRow < 3; boxRow++) {
for (let boxCol = 0; boxCol < 3; boxCol++) {
const box = [];
for (let r = boxRow * 3; r < (boxRow + 1) * 3; r++) {
for (let c = boxCol * 3; c < (boxCol + 1) * 3; c++) {
box.push(board[r][c]);
}
}
if (!isValidGroup(box)) {
return false;
}
}
}

return true;
};

25.45MB, 19ms