简单

69.x的平方根

给你一个非负整数 x ,计算并返回 x 的 算术平方根 。
由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。

注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。

示例 1:

  1. 输入:x = 4
  2. 输出:2

示例 2:

  1. 输入:x = 8
  2. 输出:2
  3. 解释:8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。

提示:

  • 0 <= x <= 231 - 1

题解

  1. /**
  2. * @param {number} x
  3. * @return {number}
  4. */
  5. var mySqrt = function(x) {
  6. };

中等

50.Pow(x, n)

46.全排列

给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

示例 1:

  1. 输入:nums = [1,2,3]
  2. 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

示例 2:

  1. 输入:nums = [0,1]
  2. 输出:[[0,1],[1,0]]

示例 3:

  1. 输入:nums = [1]
  2. 输出:[[1]]

提示:

  • 1 <= nums.length <= 6
  • -10 <= nums[i] <= 10
  • nums 中的所有整数 互不相同

题解

递归

  1. /**
  2. * @param {number[]} nums
  3. * @return {number[][]}
  4. */
  5. // [1, 2, 3]
  6. // temp [1]
  7. var permute = function(nums) {
  8. let list = [];
  9. backtrack(list, [], nums);
  10. return list;
  11. };
  12. function backtrack(list, temp, nums) {
  13. // 终止条件
  14. if (temp.length === nums.length) {
  15. return list.push([...temp]);
  16. }
  17. for (let i = 0; i < nums.length; i++) {
  18. if (temp.includes(nums[i])) continue;
  19. temp.push(nums[i]);
  20. backtrack(list, temp, nums);
  21. temp.pop();
  22. }
  23. }

79.单词搜索

给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

示例 1:
image.png

  1. 输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
  2. 输出:true

示例 2:
image.png

  1. 输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "SEE"
  2. 输出:true

示例 3:
image.png

  1. 输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCB"
  2. 输出:false

提示:

  • m == board.length
  • n = board[i].length
  • 1 <= m, n <= 6
  • 1 <= word.length <= 15
  • board 和 word 仅由大小写英文字母组成

题解

递归 + 回朔

  1. /**
  2. * @param {character[][]} board
  3. * @param {string} word
  4. * @return {boolean}
  5. */
  6. var exist = function(board, word) {
  7. // 1.怎么找
  8. // 2.什么时候终止
  9. // 3.find内部 怎么找下一步(缓存存储中间的过程)
  10. if (board.length === 0) return false;
  11. if (word.length === 0) return true;
  12. const row = board.length;
  13. const col = board[0].length;
  14. // 怎么找
  15. for (let i = 0; i < row; i++) {
  16. for (let j = 0; j < col; j++) {
  17. let ret = find(i, j, 0);
  18. if (ret) return true;
  19. }
  20. }
  21. return false;
  22. function find(i, j, cur) {
  23. // 越界要停止
  24. if (i >= row || i < 0) return false;
  25. if (j >= col || j < 0) return false;
  26. const letter = board[i][j];
  27. // 字母不匹配
  28. if (letter !== word[cur]) return false;
  29. // 找到最后一个了,而且相等
  30. if (cur === word.length - 1) return true;
  31. // --终止条件
  32. board[i][j] = null; // 当前路径标记为null
  33. // ['A','B','C','E'],
  34. // ['S','F','C','S'],
  35. // ['A','D','E','E'],
  36. const ret = find(i+1,j,cur+1) ||
  37. find(i-1,j,cur+1) ||
  38. find(i,j+1,cur+1) ||
  39. find(i,j-1,cur+1);
  40. board[i][j] = letter;
  41. return ret;
  42. }
  43. };

困难

51.N皇后