Algorithm
lc36_有效的数独
思路:
直接模拟,遍历行唯一1-9,列唯一1-9,3x3唯一1-9,如果发现重复则返回false,否则返回true。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
impl Solution {
pub fn is_valid_sudoku(board: Vec<Vec<char>>) -> bool {
// 检查行
for i in 0..9 {
let mut used = vec![false; 10];
for j in 0..9 {
if board[i][j] != '.' {
let num = (board[i][j] as u8 - b'0') as usize;
if used[num] {
return false;
}
used[num] = true;
}
}
}
// 检查列
for j in 0..9 {
let mut used = vec![false; 10];
for i in 0..9 {
if board[i][j] != '.' {
let num = (board[i][j] as u8 - b'0') as usize;
if used[num] {
return false;
}
used[num] = true;
}
}
}
// 检查3x3子格
for box_row in 0..3 {
for box_col in 0..3 {
let mut used = vec![false; 10];
for i in 0..3 {
for j in 0..3 {
let row = box_row * 3 + i;
let col = box_col * 3 + j;
if board[row][col] != '.' {
let num = (board[row][col] as u8 - b'0') as usize;
if used[num] {
return false;
}
used[num] = true;
}
}
}
}
}
true
}
}
|
题解通过提前初始化3个计数器,巧妙设计了除数计数器,从而做到了一次遍历即可:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
int rows[9][9];
int columns[9][9];
int subboxes[3][3][9];
memset(rows,0,sizeof(rows));
memset(columns,0,sizeof(columns));
memset(subboxes,0,sizeof(subboxes));
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
char c = board[i][j];
if (c != '.') {
int index = c - '0' - 1;
rows[i][index]++;
columns[j][index]++;
subboxes[i / 3][j / 3][index]++;
if (rows[i][index] > 1 || columns[j][index] > 1 || subboxes[i / 3][j / 3][index] > 1) {
return false;
}
}
}
}
return true;
}
};
|
Review
为什么你应该停止设定目标?【TED演讲】
第二次听,明显听懂的内容多了许多
设置目标有许多好处,但是确定性的目标也有一些坏处:
- 目标太高会导致过度焦虑或紧张,导致发挥失常或者影响身心健康。
- 目标太低则可能完成就放松不继续前进了。
所以演讲者提出一个观点是设置一个长期无限的目标方向,然后通过观察自己每天的进展来判断是否需要调整每日目标。
Tip
对话Ray Dalio_从资产配置到财富传承,给中国朋友的10条理财法则
Share
Unitas项目介绍