53. 最大子序和

问题是怎么保证当前k最大就替换

  1. /**
  2. * @param {number[]} nums
  3. * @return {number}
  4. */
  5. var maxSubArray = function(nums) {
  6. // 动态规划
  7. var res = nums[0];
  8. var pre = 0;
  9. for(let k of nums) {
  10. pre = Math.max(k, pre + k)
  11. res = Math.max(res, pre)
  12. };
  13. return res
  14. };

70. 爬楼梯

  1. /**
  2. * @param {number} n
  3. * @return {number}
  4. */
  5. // 递归为啥报错了
  6. var climbStairs = function(n) {
  7. // 动态规划
  8. // f(n) = f(n - 2) + f(n - 1)
  9. if (n <= 2) {
  10. return n;
  11. }
  12. return climbStairs(n - 1) + climbStairs( n - 2);
  13. };
  14. // 求动态规划
  15. dp[i] = dp[i - 2] + dp[i - 1]
  16. var climbStairs = function(n) {
  17. let p = 0, q = 0, r = 1;
  18. for (let i = 1; i <= n; ++i) {
  19. p = q;
  20. q = r;
  21. r = p + q;
  22. }
  23. return r;
  24. };

46. 全排列

  1. /**
  2. * @param {number[]} nums
  3. * @return {number[][]}
  4. */
  5. var permute = function(nums) {
  6. let len = nums.length, result = [], visited = new Array(len).fill(false);
  7. const dfs = (depth, path, visited) => {
  8. // 遍历到叶子结点了,可以返回了
  9. if(depth === len) {
  10. result.push([...path]);
  11. }
  12. for(let i = 0; i < len; i++) {
  13. // 如果没遍历过
  14. if(!visited[i]) {
  15. // 压入 path 数组,然后是否遍历过的数组此下标处变为 true
  16. path.push(nums[i]);
  17. visited[i] = true;
  18. // 继续 dfs,直到最后一层
  19. dfs(depth + 1, path, visited);
  20. // 进行回溯,还原,以便下一次使用
  21. visited[i] = false;
  22. path.pop();
  23. }
  24. }
  25. }
  26. dfs(0, [], visited);
  27. return result;
  28. }