LeetCode[Hash Table]: Valid Sudoku

Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules.

The Sudoku board could be partially filled, where empty cells are filled with the character ‘.‘.

A partially filled sudoku which is valid.

Note:

A valid Sudoku board (partially filled) is not necessarily solvable. Only the filled cells need to be validated.

解法一

思路:遍历三次board,分别验证行、列和九宫格。

    bool isValidSudoku(vector<vector<char> > &board) {
        unsigned char certifier[10];

        // Each row must have the numbers 1-9 occuring just once.
        for (int i = 0; i < board.size(); ++i) {
            memset(certifier, 0, sizeof(unsigned char) * 10);
            for (int j = 0; j < board[0].size(); ++j) {
                char cell = board[i][j];
                if (cell != '.') {
                    cell -= '0';
                    if (certifier[cell]) return false;
                    else certifier[cell] = 1;
                }
            }
        }

        // Each column must have the numbers 1-9 occuring just once.
        for (int j = 0; j < board[0].size(); ++j) {
            memset(certifier, 0, sizeof(unsigned char) * 10);
            for (int i = 0; i < board.size(); ++i) {
                char cell = board[i][j];
                if (cell != '.') {
                    cell -= '0';
                    if (certifier[cell]) return false;
                    else certifier[cell] = 1;
                }
            }
        }

        // And the numbers 1-9 must occur just once in each of the 9 sub-boxes of the grid.
        for (int m = 0; m < board.size(); m += 3) {
            for (int n = 0; n < board[0].size(); n += 3){
                memset(certifier, 0, sizeof(unsigned char) * 10);
                for (int i = 0; i < 3; ++i) {
                    for (int j = 0; j < 3; ++j) {
                        char cell = board[m + i][n + j];
                        if (cell != '.') {
                            cell -= '0';
                            if (certifier[cell]) return false;
                            else certifier[cell] = 1;
                        }
                    }
                }
            }
        }

        return true;
    }

解法二

思路:遍历一次board,同时验证行、列和九宫格。不过需要牺牲一定的空间复杂度。

    bool isValidSudoku(vector<vector<char> > &board) {
        unsigned char rowCertifier[9][9] = {0}, colCertifier[9][9] = {0}, boxCertifier[9][9] = {0};

        for (int i = 0; i < board.size(); ++i) {
            for (int j = 0; j < board[0].size(); ++j) {
                char cell = board[i][j];
                if (cell != '.') {
                    cell -= '1';
                    if (rowCertifier[i][cell]) return false; // Each row must have the numbers 1-9 occuring just once.
                    else rowCertifier[i][cell] = 1;
                    if (colCertifier[cell][j]) return false; // Each column must have the numbers 1-9 occuring just once.
                    else colCertifier[cell][j] = 1;
                    if (boxCertifier[i/3*3 + j/3][cell]) return false; // And the numbers 1-9 must occur just once in each of the 9 sub-boxes of the grid.
                    else boxCertifier[i/3*3 + j/3][cell] = 1;
                }
            }
        }

        return true;
    }
时间: 2024-10-13 11:55:18

LeetCode[Hash Table]: Valid Sudoku的相关文章

[Leetcode][Python]36: Valid Sudoku

# -*- coding: utf8 -*-'''__author__ = '[email protected]' 36: Valid Sudokuhttps://oj.leetcode.com/problems/valid-sudoku/ Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules.The Sudoku board could be partially filled, where empty

leetcode笔记:Valid Sudoku

一.题目描述 Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules: http://sudoku.com.au/TheRules.aspx . The Sudoku board could be partially filled, where empty cells are filled with the character '.'. The following figure: A partially f

【LeetCode】36 - Valid Sudoku

Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules.(http://sudoku.com.au/TheRules.aspx) The Sudoku board could be partially filled, where empty cells are filled with the character '.'. A partially filled sudoku which is valid. N

【Leetcode】036. Valid Sudoku

题目: Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku board could be partially filled, where empty cells are filled with the character '.'. A partially filled sudoku which is valid. Note:A valid Sudoku board (partia

[LeetCode 36&amp;37] Valid Sudoku &amp; Sudoku Solver (数独问题)

题目链接:valid-sudoku import java.util.Arrays; /** * Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku board could be partially filled, where empty cells are filled with the character '.'. A partially filled sudoku whic

LeetCode 36/37. Valid Sudoku/ Sudoku Solver

1. 题目分析 36 Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku board could be partially filled, where empty cells are filled with the character '.'. A partially filled sudoku which is valid. Note: A valid Sudoku board

LeetCode[Hash Table]: Two Sum

Given an array of integers, find two numbers such that they add up to a specific target number. The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2. Please note that

LeetCode OJ:Valid Sudoku(有效数独问题)

Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku board could be partially filled, where empty cells are filled with the character '.'. 注意这里的有效数独并非指的是可以解出来,只要存在的数满足数独的条件就可以了. 原理很简单,但是判定在同一个blocks的时候出了点问题,没想到判定方法,看了下

LeetCode Medium: 36. 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 digits 1-9 without repetition. Each column must contain the digits 1-9 without repetition. Each of t