兔` 、

1.两数之和

  1. /**
  2. * @param {number[]} nums
  3. * @param {number} target
  4. * @return {number[]}
  5. */
  6. var twoSum = function(nums, target) {
  7. var visitedMap = {} // 已经访问过的数组元素及下标
  8. for (var i = 0; i < nums.length; i++){
  9. const curNum = nums[i]
  10. const wantedNum = target - curNum // 要找的目标值
  11. if (visitedMap[wantedNum]!==undefined){ // 目标值在map中存在
  12. if(visitedMap[wantedNum] !== i) { // 下标不重复
  13. return [visitedMap[wantedNum], i] // 返回结果
  14. }
  15. } else {
  16. visitedMap[curNum] = i // 没有找到,将当前数值加入到map中
  17. }
  18. }
  19. return []
  20. };

79单词搜索

  1. const exist = (board, word) => {
  2. const m = board.length;
  3. const n = board[0].length;
  4. const used = new Array(m); // 二维矩阵used
  5. // 空矩阵,用来记录是否访问过
  6. for (let i = 0; i < m; i++) {
  7. used[i] = new Array(n);
  8. }
  9. // 判断当前点是否是目标路径上的点
  10. const canMove = (row, col, i) => { // row col是当前点的坐标,i是当前考察的字符索引
  11. if (i > word.length - 1) { // 递归的出口
  12. return true;
  13. }
  14. if (row < 0 || row >= m || col < 0 || col >= n) { // 当前点不存在
  15. return false;
  16. }
  17. if (used[row][col] || board[row][col] != word[i]) { // 当前的点已经走过,或当前点就不是目标点
  18. return false;
  19. }
  20. // 排除掉这些false情况,当前点是没问题的,可以继续递归考察
  21. used[row][col] = true; // used记录一下当前点被访问了
  22. const canMoveRest =
  23. canMove(row + 1, col, i + 1) ||
  24. canMove(row - 1, col, i + 1) ||
  25. canMove(row, col + 1, i + 1) ||
  26. canMove(row, col - 1, i + 1);
  27. if (canMoveRest) { // 基于当前点,可以为剩下的字符找到路径
  28. return true;
  29. }
  30. used[row][col] = false; // 找不出,返回false,继续考察别的分支,并撤销当前点的访问状态。
  31. return false;
  32. };
  33. for (let i = 0; i < m; i++) {
  34. for (let j = 0; j < n; j++) {
  35. if (board[i][j] == word[0] && canMove(i, j, 0)) { // 找到dfs的起点
  36. return true; // 找到起点,且dfs的结果也true,则找到了目标路径
  37. }
  38. }
  39. }
  40. return false; // 怎么样都没有返回true,则返回false
  41. }

104: 树的最大深度

  1. /**
  2. * Definition for a binary tree node.
  3. * function TreeNode(val) {
  4. * this.val = val;
  5. * this.left = this.right = null;
  6. * }
  7. */
  8. /**
  9. * @param {TreeNode} root
  10. * @return {number}
  11. */
  12. var maxDepth = function(root) {
  13. if(root == null) {
  14. return 0;
  15. } else {
  16. let left = maxDepth(root.left);
  17. let right = maxDepth(root.right);
  18. return Math.max(left, right) + 1;
  19. }
  20. };

141 环型链表

  1. /**
  2. * Definition for singly-linked list.
  3. * function ListNode(val) {
  4. * this.val = val;
  5. * this.next = null;
  6. * }
  7. */
  8. /**
  9. * @param {ListNode} head
  10. * @return {boolean}
  11. */
  12. var hasCycle = function(head) {
  13. let map = new Map()
  14. // 1. 如果链表没有结束
  15. while (head) {
  16. // 2. 如果之前访问过, 证明有环
  17. if (map.has(head)) {
  18. return true;
  19. } else {
  20. // 3. 登记一下
  21. map.set(head, true)
  22. }
  23. // 4. 一直往链表尾部走
  24. head = head.next;
  25. }
  26. // 5. 如果没有重复,那么返回 false
  27. return false;
  28. };