目录
第十二章 算法设计思想之“分而治之”
12.1 分而治之简介
12.2 LeetCode: 374. 猜数字大小
var guessNumber = function(n){
//写一个递归函数
const rec=(low,high)=>{
if(low>high){
return;}//给一个跳出递归函数的条件
const mid=Math.floor((low+high)/2);//取中间元素
const res =guess(mid);//猜值
if(res===0){
//猜对了返回值
return mid;
}else if(res===1){
//猜的值小了,继续在大的一半猜
return rec(mid+1,high);
}else{
//猜的值大了,继续在小的一半猜
return rec(1,mid-1);
}
};
return rec(1,n);//返回值的范围
};
时间复杂度:log(n)
空间复杂度:log(n)
12.3 LeetCode: 226. 翻转二叉树
var invertTree = function (root) {
if (!root) {
return null; }//停止条件
return {
val: root.val;//根节点的值不变
left: invertTree(root.right);//把翻转后的右子树放到左子树中
right: invertTree(root.left);//把翻转后的左子树放到右子树中
}
};
1.时间复杂度:log(n)
2.空间复杂度:最好log(h),h为树的高度 。最差O(n)
12.4 LeetCode: 100. 相同的树
var isSameTree = function (p, q) {
if (!p && !q) return true;//当p和q都为空时,两棵树相同,返回true
if (
p && q && //p和q树存在
p.val === q.val &&//p的根节点的值等于q的根节点的值
isSameTree(p.left, q.left) &&//p的左子树等于q的左子树
isSameTree(p.right, q.right)//p的右子树等于q的右子树
) {
return true;//当p和q两棵树相同,返回true
}
return false;//当p和q两棵树不相同,返回false
};
1.时间复杂度:log(n)
2.空间复杂度:最好log(h),h为树的高度 。最差O(n)扫描二维码关注公众号,回复: 15640900 查看本文章
12.5 LeetCode: 101. 对称二叉树
var isSymmetric = function (root) {
if (!root) return true;//当根节点为空时,返回true
const isMisrror = (l, r) => {
if (!l && !r) return true;//跳出递归,当左子树为空且右子树也为空时,两树相同,返回true
if (l && r &&左子树和右子树存在
l.val === r.val &&//左子树根节点的值等于右子树根节点的值
isMisrror(l.left, r.right) &&//左子树等于右子树
isMisrror(l.right, r.left)//右子树等于左子树
) {
return true;
}
return false;
};
return isMisrror(root.left, root.right);
};
1.时间复杂度:log(n)
2.空间复杂度:最好log(h),h为树的高度 。最差O(n)
12.6 分而治之总结