- 解密消息">A: 解密消息
- 螺旋矩阵 IV">B: 螺旋矩阵 IV
- 知道秘密的人数">C: 知道秘密的人数
- 网格图中递增路径的数目">D: 网格图中递增路径的数目
- 🛵复盘
不积跬步,无以至千里;不积小流,无以成江海
📅:2020-7-3 🔗:https://leetcode.cn/contest/weekly-contest-300
A: 解密消息
思路:
关键点:
/*** @param {string} key* @param {string} message* @return {string}*/var decodeMessage = function(key, message) {let decodeMap = new Map();const m = key.length, n = 26;for (let i = 0, j = 0; i < m; i++) {let char = key.charAt(i);if (char != ' ' && !decodeMap.has(char)) {decodeMap.set(char, String.fromCharCode(j + 97));j++;}}let ans = [];for (let char of message) {ans.push(char == ' ' ? ' ' : decodeMap.get(char));}return ans.join('');};
总结:
B: 螺旋矩阵 IV
思路:螺旋矩阵
关键点:边界
/*** @param {number} m* @param {number} n* @param {ListNode} head* @return {number[][]}*/var spiralMatrix = function(m, n, head) {const dirs = [[0, 1], [1, 0], [0, -1], [-1, 0]];let ans = Array.from({ length: m }, v => new Array(n).fill(-1));let i = 0, j = 0, k = 0;while (head) {ans[i][j] = head.val;head = head.next;let x = i + dirs[k][0];let y = j + dirs[k][1];if (x < 0 || x > m - 1 || y < 0 || y > n - 1 || ans[x][y] != -1) {k = (k + 1) % 4;}i = i + dirs[k][0];j = j + dirs[k][1];}return ans;};
总结:
雷同59. 螺旋矩阵 II
C: 知道秘密的人数
思路:动态规划
关键点:
/*** @param {number} n* @param {number} delay* @param {number} forget* @return {number}*/var peopleAwareOfSecret = function(n, delay, forget) {let dp = new Array(n + 1).fill(0n);dp[1] = 1n;for (let i = 2; i <= n; i++) {let pre = 0n;for (let j = i - forget + 1; j <= i - delay; j++) {if (j > 0) {pre += dp[j];}}dp[i] = pre;}let pre = 0n;let i = n + 1;for (let j = i - forget; j < i; j++) {if (j > 0) {pre += dp[j];}}return Number(pre % BigInt(10 ** 9 + 7));};
总结:
D: 网格图中递增路径的数目
思路:dp + dfs-最大岛屿问题
关键点:
/*** @param {number[][]} grid* @return {number}*/var countPaths = function(grid) {const mod = BigInt(10 ** 9 + 7);const dirs = [[0, 1], [1, 0], [0, -1], [-1, 0]];const m = grid.length, n = grid[0].length;const dp = Array.from({ length: m }, v => new Array(n).fill(-1n));function dfs (x, y) {if (dp[x][y] != -1) return dp[x][y];let count = 1n;for (let [dx, dy] of dirs) {let i = x + dx, j = y + dy;if (i < 0 || i >= m || j < 0 || j >= n || grid[i][j] <= grid[x][y]) continue;count = (count + dfs(i, j)) % mod;}dp[x][y] = count;return count;}let sum = 0n;for (let i = 0; i < m; i++) {for (let j = 0; j < n; j++) {sum = (sum + dfs(i, j)) % mod;}}return Number(sum);};
总结:
🛵复盘

| 序号 | 是否通过 | 说明 | 待加强 |
|---|---|---|---|
| A: | ✅ | ||
| B: | ✅ | 第一次缺少访问过判断 | |
| C: | ✅ | 数字超出范围, 改为bigint后运算 时间不够 |
|
| D: | ❌ | 时间不够 |
🚀收获: 最高一次排名 推测原因:
- 充足的休息
- 心态平静
- 面对问题耐心分析原因
