算法学习记录(二十六)

132 阅读1分钟

问:

  1. 最大子序和
  2. 比较版本号
  3. 求根到叶子节点数字之和
  4. 路径总和
  5. 两数之和

解:

  1. 若当前和小于0,就舍弃当前和,重置为0继续
function maxSubArray(arr) {
    let maxSub = Number.MIN_SAFE_INTEGER
    let curSub = 0
    for (let i = 0; i < arr.length; i++) {
        curSub < 0 ? curSub = 0 : ''
        curSub += arr[i]
        maxSub = Math.max(curSub, maxSub)
    }
    return maxSub
}
  1. 对字符数少的版本号补零。
function compareVersion(version1, version2) {
    const v1 = version1.split('.')
    const v2 = version2.split('.')
    let res = 0
    while (v1.length < v2.length) {
        v1.push(0)
    }
    while (v2.length <v1.length) {
        v2.push(0)
    }
    while (v1.length) {
        let val1 = v1.shift()
        let val2 = v2.shift()
        if (+val1 < val2) {
            res = -1
            break
        }
        if (+val1 > +val2) {
            res = 1
            break
        }
    }
    return res
}
  1. 深度优先,当走到空时返回0,走到叶节点时返回累加和。
function sumNumbers(root) {
    function getRes(node, preSum) {
        if (!node) return 0
        const cur = preSum * 10 + node.val 
        if (!node.right && !node.left) return cur
        return getRes(node.left, cur) + getRes(node.right, cur)
    }
    return getRes(root, 0)
}
  1. 深度优先,走到空时返回false,走到叶节点时做一次判断。
function sumNumbers(root, targetSum) {
    if (!root) return false
    function getRes(node, preSum) {
        if (!node) return false
        preSum += node.val
        if (!node.left && !node.right) return preSum === target
        return getRes(node.left, preSum) || getRes(node.right, preSum)
    }
    return getRes(root, 0)
}

5.第一次遍历用哈希存值,第二次遍历,在哈希表中找需要的值

function twoSum(nums, target) {
    const hashMap = new Map()
    nums.forEach((val, idx) => {
        hashMap.set(val, idx)
    })
    for (let i = 0; i < nums.length; i++) {
        const idx = hashMap.get(target - nums[i])
        if (idx && idx !== i) {
            return [i, idx]
        }
    }
    return []
}