5. 最长回文子串

121. 买卖股票的最佳时机

  1. /**
  2. * @param {number[]} prices
  3. * @return {number}
  4. */
  5. // 求targetDecrease值最大
  6. var maxProfit = function(prices) {
  7. var min = prices[0]
  8. var maxprofit = 0
  9. for (let j = 0; j < prices.length; j++) {
  10. if (prices[j] < min) {
  11. min = prices[j]
  12. } else if (prices[j] - min > maxprofit) {
  13. maxprofit = prices[j] - min
  14. }
  15. }
  16. return maxprofit
  17. };

54. 螺旋矩阵

按照层每次顺时针往前,每层结束时更新各个角的坐标,直到走完。
image.png
https://leetcode-cn.com/problems/spiral-matrix/solution/luo-xuan-ju-zhen-by-leetcode-solution/

  1. var spiralOrder = function(matrix) {
  2. if (!matrix.length || !matrix[0].length) {
  3. return [];
  4. }
  5. const rows = matrix.length, columns = matrix[0].length;
  6. const order = [];
  7. let left = 0, right = columns - 1, top = 0, bottom = rows - 1;
  8. // while的条件为什么是这样
  9. while (left <= right && top <= bottom) {
  10. // 上
  11. for (let column = left; column <= right; column++) {
  12. order.push(matrix[top][column]);
  13. }
  14. // 右
  15. for (let row = top + 1; row <= bottom; row++) {
  16. order.push(matrix[row][right]);
  17. }
  18. ??
  19. if (left < right && top < bottom) {
  20. for (let column = right - 1; column > left; column--) {
  21. order.push(matrix[bottom][column]);
  22. }
  23. for (let row = bottom; row > top; row--) {
  24. order.push(matrix[row][left]);
  25. }
  26. }
  27. [left, right, top, bottom] = [left + 1, right - 1, top + 1, bottom - 1];
  28. }
  29. return order;
  30. };

695. 岛屿的最大面积

  1. /**
  2. * @param {number[][]} grid
  3. * @return {number}
  4. */
  5. // 题意是求有边界的1有多少个岛
  6. // 两次循环走网格,
  7. // 终止条件为x轴的点大于grid[0],y轴的点小于grid.size
  8. // 如果检测点为1,count++
  9. var maxAreaOfIsland = function(grid) {
  10. var max = 0
  11. var count = 0
  12. var isArea = (i, j) => {
  13. // 这里巨饶,因为i其实是y轴
  14. return (i >=0 && i < grid.length && j >=0 && j < grid[0].length)
  15. }
  16. var dfs = (grid, i, j) => {
  17. // 超出区域
  18. if (!isArea(i, j)) {
  19. return
  20. }
  21. // 如果不是岛屿
  22. if (grid[i][j] !== '1') {
  23. count = 0
  24. return
  25. }
  26. // 标记过已经走的
  27. grid[i][j] = '2'
  28. // 寻找上下左右
  29. dfs(grid, i, j - 1)
  30. dfs(grid, i, j + 1)
  31. dfs(grid, i - 1, j)
  32. dfs(grid, i + 1, j)
  33. }
  34. // 外层循环是每个y轴的
  35. for (let i = 0; i < grid.length; i++) {
  36. // 内层循环是每个x轴的
  37. for (let j = 0; j < grid[0].length; j++) {
  38. if (grid[i][j] === '1') {
  39. max = Math.max(max, ++count)
  40. dfs(grid, i, j)
  41. }
  42. }
  43. }
  44. return count
  45. };

209. 长度最小的子数组

  1. /**
  2. * @param {number} target
  3. * @param {number[]} nums
  4. * @return {number}
  5. */
  6. // 找到最短的数组之和 >= target,返回数组长度
  7. // 双指针
  8. var minSubArrayLen = function(target, nums) {
  9. var res = 0
  10. for (let j = 0; j < nums.length; j++) {
  11. var tmp = 0
  12. var left = j
  13. var right = nums.length - 1
  14. // 思路理解,但是不对
  15. while(left < right && target > tmp) {
  16. tmp += nums[left]
  17. if (nums[left] + tmp >= target) {
  18. temp = 0
  19. res = Math.min(res, left - j)
  20. }
  21. left++
  22. }
  23. }
  24. return res
  25. };

剑指 Offer 22. 链表中倒数第K个节点

  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. * @param {number} k
  11. * @return {ListNode}
  12. */
  13. var getKthFromEnd = function(head, k) {
  14. // 1、计算长度,再len - k即为断的节点
  15. // 2、先反转链表,在到第K个时候断掉,再反转
  16. let len = 0
  17. let link = head
  18. while(link) {
  19. len++
  20. link = link.next
  21. }
  22. link = head
  23. for (let i = 0; i < len - k; i++) {
  24. link = link.next
  25. }
  26. return link
  27. };

226. 翻转二叉树

1、递归

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {TreeNode}
 */
var invertTree = function(root) {
    if (root === null) {
        return null;
    }
    // 递归
    let left = invertTree(root.left)
    let right = invertTree(root.right)
    root.right = left
    root.left = right
    return root
};

2、bfs

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {TreeNode}
 */
var invertTree = function(root) {
    if (root === null) {
        return null;
    }
    var q = [root]
    while(q.length) {
      var tmp = q.pop()
      var left = tmp.left

      tmp.left = tmp.right
      tmp.right = left

      if (tmp.left) {
        q.push(tmp.left)
      }
      if (tmp.right) {
        q.push(tmp.right)
      }
    }
  return root
};