5月30日刷题笔记——数组
题目1:118. 杨辉三角(简单题)
我的题解:
class Solution {
public:
vector<vector<int>> generate(int numRows) {
// 定义二维数组存放杨辉三角
vector<vector<int>> tri;
vector<int> temp;
for(int i = 0; i < numRows; i++){
for(int j = 0; j <= i; j++){
if(j != 0 && j != i){
temp.push_back(tri[i-1][j-1] + tri[i-1][j]);
}
else{
temp.push_back(1);
}
}
tri.push_back(temp);
temp.clear();
}
return tri;
}
};
总结知识点:
1.二维数组想要push_back()可以用一个一维数组push_back()过渡,然后再将一维数组push_back()到二维数组内。
题目2:36. 有效的数独(中等题)
我的题解:
class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
unordered_set<char> row;
unordered_set<char> col;
unordered_set<char> block;
// vector<vector<int>> three;
// 求矩阵的行列数,这里行数=列数
int n = board.size();
int a = 0;
int b = 0;
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
if(row.count(board[i][j]) && board[i][j] != '.'){
return false;
}
row.insert(board[i][j]);
if(col.count(board[j][i]) && board[j][i] != '.'){
return false;
}
col.insert(board[j][i]);
if(a <= 2 && b == 0){
// cout << board[i][j] << ' ' << board[i+1][j];
// cout << ' ' << board[i+2][j] << endl;
if(block.count(board[i][j]) && board[i][j] != '.'){
return false;
}
block.insert(board[i][j]);
if(block.count(board[i+1][j]) && board[i+1][j] != '.'){
return false;
}
block.insert(board[i+1][j]);
if(block.count(board[i+2][j]) && board[i+2][j] != '.'){
return false;
}
block.insert(board[i+2][j]);
if((i+3) % 3 == 0 && (j+1) % 3 == 0){
block.clear();
}
}
a++;
if(a == 3) {
a = 0;
}
}
b++;
if(b == 3){
b = 0;
}
row.clear();
col.clear();
}
return true;
}
};
总结知识点:
1.哈希表建的set时用insert插入数据。
参考题解:
class Solution {
public boolean isValidSudoku(char[][] board) {
//定义数字行内出现的次数
int[][] row = new int[9][9];
//定义数字列内出现的次数
int[][] column = new int[9][9];
//定义数字九宫格内出现的次数最大为9次
int[][][] jiugongge = new int[3][3][9];
//遍历数组
for (int i =0;i <9;i++){
for(int j = 0;j<9;j++){
char c = board[i][j];
//只要存在数字
if (c !='.'){
//把数字-1化成索引下标,c是字符串要减去字符串,-1会报错。
int index = c-'1';
//这个时候++意思是第i行这个c值次数+1,默认row第二位就是{1-9}-1;每一行都有可能是1-9
//例如现在是第一行第一列是9,就在row[1][8]号位置+1
row[i][index]++;
//列同理
column[j][index]++;
//并且九宫格内次数也要+1,例如也是第1行第一列,i/3 j/3会自动定位到所在的小宫格
jiugongge[i/3][j/3][index]++;
//次数大于1就不成立一个数独
if (row[i][index]>1||column[j][index]>1||jiugongge[i/3][j/3][index]>1) return false;
}
}
}
return true;
}
}
思路相同但是比我的简化很多的评论区大佬题解:
class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
int n = board.size();
for (int i = 0; i < n; i++) {
unordered_set<int> coloum;
unordered_set<int> row;
unordered_set<int> cell;
for (int j = 0; j < n; j++) {
if (board[i][j] != '.' && coloum.count(board[i][j])) {
return false;
}
if (board[j][i] != '.' && row.count(board[j][i])){
return false;
}
int a = (i / 3) * 3 + j / 3;
int b = (i % 3) * 3 + j % 3;
if (board[a][b] != '.' && cell.count(board[a][b])) {
return false;
}
coloum.insert(board[i][j]);
row.insert(board[j][i]);
cell.insert(board[a][b]);
}
}
return true;
}
};