Leetcode36. Valid Sudoku | 模拟

1.题意
给定一个数独,判断是否有效。判定条件:一行/列/3*3九宫格中同一个数字只能出现一次。
注意:
1.判断有效即可,不用考虑是否有解
2.board[i][j] is a digit 1-9 or ‘.’ 不用考虑非法(1-9以外)的情况

2.算法
模拟/暴力

3.总结
本题有3个小细节:
1.char到int的转换,-'0’即可。很多题解是-'1’或者-‘0’-1,之所以如此是因为最开始开的是99的数组,实际这个操作-'0’就可以,数组开成1010就好。
2.3x3九宫格如何用一维坐标表示?3*(行/3)+列/3。这里最开始并没有想到,看了题解才意识到可以这样做。
3.c++初始化数组可以直接={0},这样就不用写三遍memset了。

4.代码

class Solution {
public:
    bool isValidSudoku(vector<vector<char>>& board) {
        int rowmark[10][10], colmark[10][10], cellmark[10][10], num;
        memset(rowmark, 0, sizeof(rowmark));
        memset(colmark, 0, sizeof(colmark));
        memset(cellmark, 0, sizeof(cellmark));
        for(int i = 0;i < 9;i++){
            for(int j = 0;j < 9;j++){
                if(board[i][j] != '.'){
                    num = board[i][j] - '0';
                    if(rowmark[i][num] || colmark[j][num] || cellmark[(i/3)*3+j/3][num])
                        return false;
                    rowmark[i][num] = 1;
                    colmark[j][num] = 1;
                    cellmark[(i/3)*3+j/3][num] = 1;
                }
            }
        }
        return true;
    }
};

5.复杂度
时间复杂度O(n2)
空间复杂度O(n2)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值