每日一题 -- 树
// 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
};
最后还是没能自己想出结果来,明天再看看二分如何处理吧,继续做今天需要做的事情了。