230. 二叉搜索树中第K小的

  1. /**
  2. * Definition for b binary tree node.
  3. * function TreeNode(val, left, right) {
  4. * this.val = (val===undefined ? 0 : val)
  5. * this.left = (left===undefined ? null : left)
  6. * this.right = (right===undefined ? null : right)
  7. * }
  8. */
  9. /**
  10. * @param {TreeNode} root
  11. * @param {number} k
  12. * @return {number}
  13. */
  14. var kthSmallest = function(root, k) {
  15. // 1、递归放在数组,排序即可
  16. // 2、构建一个大顶堆
  17. // 然后最后个元素和最顶的交换,维持大顶堆,持续N次。
  18. var res = []
  19. var dfs = (root) => {
  20. if (root === null) return;
  21. res.push(root.val)
  22. dfs(root.left)
  23. dfs(root.right)
  24. }
  25. dfs(root)
  26. res = res.sort((a, b) => a - b)
  27. return res[k - 1]
  28. };

103. 二叉树的锯齿形层次

  1. /**
  2. * Definition for a binary tree node.
  3. * function TreeNode(val, left, right) {
  4. * this.val = (val===undefined ? 0 : val)
  5. * this.left = (left===undefined ? null : left)
  6. * this.right = (right===undefined ? null : right)
  7. * }
  8. */
  9. /**
  10. * @param {TreeNode} root
  11. * @return {number[][]}
  12. */
  13. // 奇数层往右边,偶数层往左
  14. // 层次遍历
  15. var zigzagLevelOrder = function(root) {
  16. let q = [root]
  17. let res = []
  18. let level = 1
  19. if (root === null) {
  20. return []
  21. }
  22. // 当前层
  23. while(q.length) {
  24. const len = q.length
  25. res.push([])
  26. // 下一层
  27. for (let j = 0; j < len; j++) {
  28. const tmp = q.shift()
  29. res[level - 1] = res[level - 1] || []
  30. if (level % 2 === 1) {
  31. res[level - 1].push(tmp.val)
  32. } else {
  33. res[level - 1].unshift(tmp.val)
  34. }
  35. if (tmp.left) {
  36. q.push(tmp.left)
  37. }
  38. if (tmp.right) {
  39. q.push(tmp.right)
  40. }
  41. }
  42. level++
  43. }
  44. return res
  45. };

剑指 Offer 62. 圆圈中最后剩下的数字

  1. // f(n, m) = (m % n + x) % n = (m + x) % n。?s

62. 不同路径

  1. /**
  2. * @param {number} m
  3. * @param {number} n
  4. * @return {number}
  5. */
  6. // 类似爬楼梯
  7. // dp为从左上角到i,j的数量
  8. // dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
  9. var uniquePaths = function(m, n) {
  10. let dp = new Array(m).fill(0).map(_ => new Array(n).fill(0))
  11. for (let i = 0; i < m; i++) {
  12. dp[i][0] = 1
  13. }
  14. for (let i = 0; i < n; i++) {
  15. dp[0][i] = 1
  16. }
  17. for (let i = 1; i < m; i++) {
  18. for (let j = 1; j < n; j++) {
  19. dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
  20. }
  21. }
  22. return dp[m - 1][n - 1]
  23. };

22. 括号生成

146. LRU缓存机制

/**
 * @param {number} capacity
 */
var LRUCache = function(capacity) {
    this.capacity = capacity;
    this.map = new Map();
};

/** 
 * @param {number} key
 * @return {number}
 */
LRUCache.prototype.get = function(key) {
     if(this.map.has(key)){
        let value = this.map.get(key);
        this.map.delete(key); // 删除后,再 set ,相当于更新到 map 最后一位
        this.map.set(key, value);
        return value
    } else {
        return -1
    }
};

/** 
 * @param {number} key 
 * @param {number} value
 * @return {void}
 */
LRUCache.prototype.put = function(key, value) {
    // 如果已有,那就要更新,即要先删了再进行后面的 set
    if(this.map.has(key)){
        this.map.delete(key);
    }
    this.map.set(key, value);
    // put 后判断是否超载
    if(this.map.size > this.capacity){
        this.map.delete(this.map.keys().next().value);// 删除最久未使用的key-value(this.map.keys().next().value表示按顺序插入map的第一个key值)
    }
};

/**
 * Your LRUCache object will be instantiated and called as such:
 * var obj = new LRUCache(capacity)
 * var param_1 = obj.get(key)
 * obj.put(key,value)
 */

2248. 多个数组求交集


// map存数字出现过的次数,,但是要避免单个数组重复
var itersectArray = (args) => {
    var mapData = {}
    var res = []
    args.map((j, index1) => {
        j.map((k, index2) => {
            if (k in mapData) {
                mapData[k]++
            } else {
                mapData[k] = 1
            }  
        })

    })
    for (let j in mapData) {
        if (mapData[j] >= args.length) {
            res.push(j)
        }
    }
    return res;

}
itersectArray([[3,1,2,4,5],[1,2,3,4],[3,4,5,6]])