微软面试题: LeetCode 36. 有效的数独 出现次数:3
题目描述:
代码:
1 class Solution { 2 public: 3 bool isValidSudoku(vector<vector<char>>& board) 4 { 5 unordered_map<int,unordered_set<char>> r_memo;//某行的所有元素 6 unordered_map<int,unordered_set<char>> c_memo;//某列的所有元素 7 unordered_map<int,unordered_set<char>> t_memo;//某方格的所有元素 8 for(int i = 0; i < 9; ++i) 9 { 10 for(int j = 0; j < 9; ++j) 11 { 12 if(board[i][j] == '.') continue; 13 //当前元素 在所在行是否已经出现过,出现过直接返回false 14 if(r_memo.find(i) != r_memo.end() && r_memo[i].find(board[i][j]) != r_memo[i].end()) 15 { 16 return false; 17 } 18 r_memo[i].insert(board[i][j]);//所在行未出现过,记录到所在行的字典里 19 //当前元素 在所在列是否已经出现过,出现过直接返回false 20 if(c_memo.find(j) != c_memo.end() && c_memo[j].find(board[i][j]) != c_memo[j].end()) 21 { 22 return false; 23 } 24 c_memo[j].insert(board[i][j]);//所在列未出现过,记录到所在列的字典里 25 26 int k = 3 * (i/3) + j/3; // 3 * x + y 根据当前元素坐标 算出所属的 九宫格序号[0,8] 27 //当前元素 在所在九宫格是否已经出现过,出现过直接返回false 28 if(t_memo.find(k) != t_memo.end() && t_memo[k].find(board[i][j]) != t_memo[k].end()) 29 { 30 return false; 31 } 32 t_memo[k].insert(board[i][j]);//所在九宫格未出现过,记录到所在九宫格的字典里 33 } 34 } 35 return true; 36 } 37 };