不积跬步,无以至千里;不积小流,无以成江海

📅:2020-7-3 🔗:https://leetcode.cn/contest/weekly-contest-300

A: 解密消息

思路:
关键点:

  1. /**
  2. * @param {string} key
  3. * @param {string} message
  4. * @return {string}
  5. */
  6. var decodeMessage = function(key, message) {
  7. let decodeMap = new Map();
  8. const m = key.length, n = 26;
  9. for (let i = 0, j = 0; i < m; i++) {
  10. let char = key.charAt(i);
  11. if (char != ' ' && !decodeMap.has(char)) {
  12. decodeMap.set(char, String.fromCharCode(j + 97));
  13. j++;
  14. }
  15. }
  16. let ans = [];
  17. for (let char of message) {
  18. ans.push(char == ' ' ? ' ' : decodeMap.get(char));
  19. }
  20. return ans.join('');
  21. };

总结:

B: 螺旋矩阵 IV

思路:螺旋矩阵
关键点:边界

  1. /**
  2. * @param {number} m
  3. * @param {number} n
  4. * @param {ListNode} head
  5. * @return {number[][]}
  6. */
  7. var spiralMatrix = function(m, n, head) {
  8. const dirs = [[0, 1], [1, 0], [0, -1], [-1, 0]];
  9. let ans = Array.from({ length: m }, v => new Array(n).fill(-1));
  10. let i = 0, j = 0, k = 0;
  11. while (head) {
  12. ans[i][j] = head.val;
  13. head = head.next;
  14. let x = i + dirs[k][0];
  15. let y = j + dirs[k][1];
  16. if (x < 0 || x > m - 1 || y < 0 || y > n - 1 || ans[x][y] != -1) {
  17. k = (k + 1) % 4;
  18. }
  19. i = i + dirs[k][0];
  20. j = j + dirs[k][1];
  21. }
  22. return ans;
  23. };

总结:
雷同59. 螺旋矩阵 II

C: 知道秘密的人数

思路:动态规划
关键点:

  1. /**
  2. * @param {number} n
  3. * @param {number} delay
  4. * @param {number} forget
  5. * @return {number}
  6. */
  7. var peopleAwareOfSecret = function(n, delay, forget) {
  8. let dp = new Array(n + 1).fill(0n);
  9. dp[1] = 1n;
  10. for (let i = 2; i <= n; i++) {
  11. let pre = 0n;
  12. for (let j = i - forget + 1; j <= i - delay; j++) {
  13. if (j > 0) {
  14. pre += dp[j];
  15. }
  16. }
  17. dp[i] = pre;
  18. }
  19. let pre = 0n;
  20. let i = n + 1;
  21. for (let j = i - forget; j < i; j++) {
  22. if (j > 0) {
  23. pre += dp[j];
  24. }
  25. }
  26. return Number(pre % BigInt(10 ** 9 + 7));
  27. };

总结:

D: 网格图中递增路径的数目

思路:dp + dfs-最大岛屿问题
关键点:

  1. /**
  2. * @param {number[][]} grid
  3. * @return {number}
  4. */
  5. var countPaths = function(grid) {
  6. const mod = BigInt(10 ** 9 + 7);
  7. const dirs = [[0, 1], [1, 0], [0, -1], [-1, 0]];
  8. const m = grid.length, n = grid[0].length;
  9. const dp = Array.from({ length: m }, v => new Array(n).fill(-1n));
  10. function dfs (x, y) {
  11. if (dp[x][y] != -1) return dp[x][y];
  12. let count = 1n;
  13. for (let [dx, dy] of dirs) {
  14. let i = x + dx, j = y + dy;
  15. if (i < 0 || i >= m || j < 0 || j >= n || grid[i][j] <= grid[x][y]) continue;
  16. count = (count + dfs(i, j)) % mod;
  17. }
  18. dp[x][y] = count;
  19. return count;
  20. }
  21. let sum = 0n;
  22. for (let i = 0; i < m; i++) {
  23. for (let j = 0; j < n; j++) {
  24. sum = (sum + dfs(i, j)) % mod;
  25. }
  26. }
  27. return Number(sum);
  28. };

总结:

🛵复盘

image.png

序号 是否通过 说明 待加强
A:
B: 第一次缺少访问过判断
C: 数字超出范围, 改为bigint后运算
时间不够
D: 时间不够

🚀收获: 最高一次排名 推测原因:

  1. 充足的休息
  2. 心态平静
  3. 面对问题耐心分析原因