leetcode 题解 || Valid Sudoku 问题

problem:

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.

Hide Tags
  Hash Table
判断一个给定的数独题目(未完全填充)是否有效

thinking:

(1)数独有效性判断的三个条件:1、每一行1~9不重复2、每一列1~9不重复3、每一块1~9不重复

(2)采用hash表判断,这里有一个小技巧: hash表初始化之后,没读取一个元素先进行判断,再修改hash表的值。

我第一次写的是先读取数独的元素修改hash表,最后再对hash表逐个判断,提交超时!!!

超时版本:

class Solution {
public:
    bool isValidSudoku(vector<vector<char> > &board) {
        bool flag_row=true,flag_column=true,flag_box=true;
        for(int row=0;row<9;row++)
        {
           if( !test_row(board,row))

                flag_row=false;
        }
        for(int column=0;column<9;column++)
        {
           if( !test_column(board,column))

                flag_column=false;
        }
        for(int i=0;i<9;i+3)
        {
            for(int j=0;j<9;j+3)
            {
                if(!test_box(board,i,j))
                    flag_box=false;
            }
        }
        return flag_box&&flag_column&&flag_row;
    }
protected:
    bool test_row(vector<vector<char> > &board, int row)
    {
        vector<int> array(9,0);
        for(int i=0;i<9;i++)
        {
            //int index=row*9+i;
            char a = board[row][i];
            if(a!='.')
                array[a-49]+=1;
        }
        for(vector<int>::const_iterator it=array.begin();it!=array.end();it++)
        {
            if(*it>1)
                return false;
        }
        return true;
    }

    bool test_column(vector<vector<char> > &board, int column)
    {
        vector<int> array(9,0);
        for(int i=0;i<9;i++)
        {
           //int index = i*9+index;
            char a = board[i][column];
            if(a!='.')
                array[a-49]+=1;
        }
        for(vector<int>::const_iterator it=array.begin();it!=array.end();it++)
        {
            if(*it>1)
                return false;
        }
        return true;
    }

    bool test_box(vector<vector<char> > &board, int i, int j)
    {
        vector<int> array(9,0);
        int start = 3*i+27*j;
        for(int k=0;k<9;k++)
        {
           // int index = start+(k/3)*9;
            char a = board[i+k/3][j+k%3];
            if(a!='.')
                array[a-49]+=1;
        }
        for(vector<int>::const_iterator it=array.begin();it!=array.end();it++)
        {
            if(*it>1)
                return false;
        }
        return true;
    }
};

先判断后修改hash表的版本,简化版本:

class Solution {
public:
bool isValidSudoku(vector<vector<char> > &board) {
        // Note: The Solution object is instantiated only once.
		vector<vector<bool>> rows(9, vector<bool>(9,false));
		vector<vector<bool>> cols(9, vector<bool>(9,false));
		vector<vector<bool>> blocks(9, vector<bool>(9,false));

		for(int i = 0; i < 9; i++)
		{
			for(int j = 0; j < 9; j++)
			{
				if(board[i][j] == '.')continue;
				int num = board[i][j] - '1';
				if(rows[i][num] || cols[j][num] || blocks[i - i%3 + j/3][num])
					return false;
				rows[i][num] = cols[j][num] = blocks[i - i%3 + j/3][num] = true;
			}
		}
		return true;
    }
};

天壤之别啊!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值