Contents

ARST打卡第330周

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项目介绍