分治,分而治之,就是一种算法设计思想。
其思路就是,将大问题分解成小问题,递归解决这些小问题,最终合并结果。
比如,快速排序,归并排序就是典型的分治思想。
leetCode. 374 猜数字游戏
猜数字游戏的规则如下:
每轮游戏,我都会从 1 到 n 随机选择一个数字。 请你猜选出的是哪个数字。 如果你猜错了,我会告诉你,你猜测的数字比我选出的数字是大了还是小了。 你可以通过调用一个预先定义好的接口 int guess(int num) 来获取猜测结果,返回值一共有 3 种可能的情况(-1,1 或 0):
-1:我选出的数字比你猜的数字小 pick < num 1:我选出的数字比你猜的数字大 pick > num 0:我选出的数字和你猜的数字一样。恭喜!你猜对了!pick == num
这个题目典型的是一个二分查找问题,不过,用分治的思想也可以完成。
leetCode. 226 翻转二叉树
翻转一棵二叉树。 示例: 输入: 4 / \ 2 7 / \ / \ 1 3 6 9 输出: 4 / \ 7 2 / \ / \ 9 6 3 1
这个题目的备注是这么说的:
这个问题是受到 Max Howell 的 原问题 启发的 : 谷歌:我们90%的工程师使用您编写的软件(Homebrew),但是您却无法在面试时在白板上写出翻转二叉树这道题,这太糟糕了。
Homebrew在Mac上几乎是人手一个的工具了,不过他的作者竟然不如你?别逗了,只能说大神偶尔会犯迷糊,但是这迷糊人家犯得你犯不得而已。
换到这个题目来看,这可能是最适合用分治来做的题目了, 四行代码搞定:
var invertTree = function(root) {if(!root) return null;return {val: root.val,left: invertTree(root.right),right: invertTree(root.left),}};
leetCode. 101 翻转二叉树
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。 1 / \ 2 2 / \ / \ 3 4 4 3
但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的: 1 / \ 2 2 \ \
这个题的难点在于分解, 就是要找到可以递归的点:这个点就是,左子树的左等于右子树的右,右子树的左等于左子树的右,按照此思路写递归,问题可解;
leetCode. 100 相同的树
给定两个二叉树,编写一个函数来检验它们是否相同。 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。 示例 1: 输入: 1 1 / \ / \ 2 3 2 3
[1,2,3], [1,2,3]输出: true 示例 2: 输入: 1 1 / \ 2 2
[1,2], [1,null,2]输出: false 示例 3: 输入: 1 1 / \ / \ 2 1 1 2
[1,2,1], [1,1,2]输出: false
