算法学习记录(六十一)

69 阅读1分钟

问:

  1. 剑指 Offer 31. 栈的压入、弹出序列
  2. 剑指 Offer 32 - I. 从上到下打印二叉树
  3. 剑指 Offer 32 - II. 从上到下打印二叉树 II
  4. 剑指 Offer 32 - III. 从上到下打印二叉树 III
  5. 剑指 Offer 33. 二叉搜索树的后序遍历序列
  6. 剑指 Offer 34. 二叉树中和为某一值的路径
  7. 剑指 Offer 39. 数组中出现次数超过一半的数字 解:
const validateStackSequences = function(pushed, popped) {
    let idx = 0
    let idx2 = 0
    const helpStack = []
    while (idx <= pushed.length && idx2 < popped.length) {
        const last = helpStack[helpStack.length - 1]
        if (last !== popped[idx2]) {
            if (idx === pushed.length) {
                return false
            }
            helpStack.push(pushed[idx])
            idx++
        }else {
            helpStack.pop()
            idx2++
        }
    }
    return !helpStack.length
};
const levelOrder = function(root) {
    if (!root) return []
    const queue = [root]
    const res = []
    while (queue.length) {
        const cur = queue.shift()
        res.push(cur.val)
        if (cur.left) queue.push(cur.left)
        if (cur.right) queue.push(cur.right)
    }
    return res
};
const levelOrder = function(root) {
    if (!root) return []
    const queue = [root]
    const res = []
    while (queue.length) {
        const tempArr = []
        const curQueue = queue.length
        for (let i = 0; i < curQueue; i++) {
            const curNode = queue.shift()
            tempArr.push(curNode.val)
            if (curNode.left) queue.push(curNode.left)
            if (curNode.right) queue.push(curNode.right)
        }
        res.push(tempArr)
    }
    return res
};
const levelOrder = function(root) {
    if (!root) return []
    const queue = [root]
    const res = []
    let tag = true
    while (queue.length) {
        const curQueue = queue.length
        res.push([])
        for (let i = 0; i < curQueue; i++) {
            const curNode = queue.shift()
            tag ? res[res.length - 1].push(curNode.val) : res[res.length - 1].unshift(curNode.val)
            if (curNode.left) queue.push(curNode.left)
            if (curNode.right) queue.push(curNode.right)
        }
        tag = !tag
    }
    return res
};
const verifyPostorder = function(arr) {
    function getRes(left, right) {
        if (left >= right) return true
        const target = arr[right]
        let idx = left
        // 找到第一个比[中]大的数
        while (idx < right) {
            if (arr[idx] > target) break
            idx++
        }
        while (idx < right) {
            if (arr[idx] < target) break
            idx++
        }
        return idx === right && getRes(left, idx - 1) && getRes(idx, right - 1)
    }
    return getRes(0, arr.length - 1)
};
const pathSum = function(root, target) {
    if (!root) return []
    const preSumMap = new Map()
    const preNodesMap = new Map()
    const res = []
    function getRes(node) {
        const preSum = preSumMap.get(node) ?? 0
        const preNodes = preNodesMap.get(node) ?? []
        if (!node.left && !node.right) {
            if (preSum + node.val === target) {
                preNodes.push(node.val)
                res.push(preNodes)
            }
            return
        }
        preNodes.push(node.val)
         if (node.left) {
            preSumMap.set(node.left, node.val + preSum)
            preNodesMap.set(node.left, [...preNodes])
            getRes(node.left)
        }
        if (node.right) {
            preSumMap.set(node.right, node.val + preSum)
            preNodesMap.set(node.right, [...preNodes])
            getRes(node.right)
        }
    }
    getRes(root)
    return res
};
const majorityElement = function(arr) {
    let candidate = null
    let count = 0
    for (let i of arr) {
        if (count === 0) candidate = i
        count += candidate === i ? 1 : -1
    }
    return candidate
};