给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
- 节点的左子树只包含 小于 当前节点的数。
- 节点的右子树只包含 大于 当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
思路
- 递归时传递 minVal, maxVal 作为合法的上下界判定
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| var isValidBST = function (root) { const checkTree = (node, minVal, maxVal) => { if (!node) { return true } return ( minVal < node.val && node.val < maxVal && checkTree(node.left, minVal, node.val) && checkTree(node.right, node.val, maxVal) ) } return checkTree(root, Number.MIN_SAFE_INTEGER, Number.MAX_SAFE_INTEGER) }
|
简化空间复杂度
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| var isInterleave = function (s1, s2, s3) { if (s1.length + s2.length !== s3.length) { return false } const dp = new Array(s2.length + 1).fill(false) dp[0] = true for (let j = 0; j < s2.length; ++j) { if (s2[j] !== s3[j]) { break } dp[j + 1] = true } for (let i = 0; i < s1.length; ++i) { dp[0] = dp[0] && s1[i] === s3[i] for (let j = 0; j < s2.length; ++j) { dp[j + 1] = (dp[j] && s2[j] === s3[i + j + 1]) || (dp[j + 1] && s1[i] === s3[i + j + 1]) } } return dp[s2.length] }
|