LeetCode 题解 | 36.有效的数独(标记法 C++)

拈花ヽ惹草 提交于 2020-02-19 20:25:41

题目描述(中等难度)

原题链接
在这里插入图片描述

算法

(标记法) O(nm)O(n*m)

  • 对于每个已填的数,用row、col和box数组来表示当前位置是否可以填该数
  • 如果出现冲突,则返回false
  • 如果都不冲突,则返回true

时间复杂度是O(nm)O(n*m)

C++代码

class Solution {
public:
    // row[x][i]表示第x行是否已经填过数字i(1-9)
    // col[y][i]表示第y行是否已经填过数字i(1-9)
    // box[x / 3][y / 3][i]表示第[x/3,y/3]个box是否已经填过数字i(1-9)
    bool row[9][10], col[9][10], box[3][3][10]; 
   
    bool isValidSudoku(vector<vector<char>>& board) {
        int n = board.size(), m = board[0].size();
        
        for (int x = 0; x < n; x ++) {
            for (int y = 0; y < m; y ++) {
                if (board[x][y] != '.') {
                    int i = board[x][y] - '0';
                    if (row[x][i] || col[y][i] || box[x / 3][y / 3][i]) {
                        return false;
                    }
                    row[x][i] = col[y][i] = box[x / 3][y / 3][i] = true;
                }
            }
        }

        return true;
    }
};

写在最后:我的博客主要是对计算机领域所学知识的总结、回顾和思考,把每篇博客写得通俗易懂是我的目标,分享技术和知识是一种快乐 ,非常欢迎大家和我一起交流学习,有任何问题都可以在评论区留言,也期待与您的深入交流(^∀^●)

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!