前端就该用 JS 刷算法6

363 阅读1分钟

每日一题 -- 树

验证二叉搜索树

// https://leetcode-cn.com/problems/validate-binary-search-tree/
/**
 * @分析
 * 1. 判断是否是是 BST,只要中序遍历过程中判断是否是递增值即可
 * 
 * @注意
 * 1. 相等值也不符合 BST
 * 2. 第一个 pre 需要自定义为 -Infinity,之后只要中序遍历即可
 */
var isValidBST = function (root) {
    let res = true
    let pre = -Infinity
    const dfs = (root) => {
        if (!root) return
        dfs(root.left)
        if (!res) return // 有一个不符合,都立即退出 dfs
        if (root.val <= pre) {
            res = false
        }
        pre = root.val
        dfs(root.right)
    }
    dfs(root)
    return res
};

91算法

二分查找

将数组分成三个子数组的方案数

- 先用暴力解,然后看看有啥可以优化的。。然后成功超时了
// https://leetcode-cn.com/problems/ways-to-split-array-into-three-subarrays/
// 将数组分成三个子数组的方案数
/**
 * 暴力解法
 * @分析
 * 1. 用两个循环来找到`好的`组合
 * 2. 先求一个剩余总数 leaveSum,根据这个可以限制左边不得超过 1/3leaveSum;在第一个循环得到符合 left 的值,然后求 mid 和 right 符合要求的情况
 * 3. 然后成功实现超时
 */
var waysToSplit = function (nums) {
    let pod = Math.pow(10, 9) + 7
    let res = 0
    let leftSum = 0
    let  leaveSum= nums.reduce((pre, cur) => pre + cur, 0) // 剩余总值,初始化时就是总和
    let maxLeft = Math.floor(leaveSum / 3) // 最大不超过总和的 1/3
    for (let i = 0; maxLeft >= leftSum; i++) {
        leftSum += nums[i]
        leaveSum -= nums[i]
        let midSum = 0
        let left = leaveSum
        for (let j = i + 1; midSum <= left; j++) {
            midSum += nums[j]
            left -= nums[j]
            if (midSum >= leftSum &&left>= midSum) {
                res++
            }
        }
    }
    return res % pod
};

最后还是没能自己想出结果来,明天再看看二分如何处理吧,继续做今天需要做的事情了。