剑指offer day4
32-2 从上到下打印二叉树 https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-ii-lcof/
这连续三题都是一样的套路,BFS
1 | class Solution{ |
32-3从上到下打印二叉树 https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-iii-lcof/
与上一题也没什么不一样的,我们只需要加一个条件进行反转就可以了
1 | class Solution { |
33、二叉搜索树的后序遍历序列 https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-hou-xu-bian-li-xu-lie-lcof/
本题我们要充分利用树,以及二分搜索树的充分性质,首先我们可以很容易的找出根节点,即后续遍历的最后一个数。
我们可以依靠这个根节点,把树分为左子树和右子树,即我们即将完成一个建树的过程,这在之前的根据前序遍历和中序遍历中已经体现过。 所有小于根节点的数,应该都是左子树,所有大于根节点的数,都是右子树。
1 | class Solution { |
34、二叉树中和为某一值的路径 https://leetcode-cn.com/problems/er-cha-shu-zhong-he-wei-mou-yi-zhi-de-lu-jing-lcof/
dfs+回溯
1 | class Solution{ |
35、复杂链表的复制 https://leetcode-cn.com/problems/fu-za-lian-biao-de-fu-zhi-lcof/
首先我们很容易的想到空间复杂度为O(n)的解法,我们利用一个哈希表存储复制的节点
1 | class Solution{ |
但是我们更应该学习原地解法,即我们不利用额外的空间复杂度。
将这个步骤分为三步
- 将所有链表复制一份,并且放在该链表的后面,例如 1->2->3->4 —-> 1->1->2->2->3->3->4->4
- 我们处理random指针
- 将所有的复制节点拼接起来
1 | class Solution { |
36、二叉搜索树与双向链表 https://leetcode-cn.com/problems/er-cha-sou-suo-shu-yu-shuang-xiang-lian-biao-lcof/
我们只要记录上一个节点即可。
这里我们对二叉搜索树进行中序遍历,这样得到的序列是有序的
1 | class Solution { |
37、序列化二叉树 https://leetcode-cn.com/problems/xu-lie-hua-er-cha-shu-lcof/
我们利用前序遍历来对其进行序列化的过程.
1 | public class Codec { |
38、字符串的排列 https://leetcode-cn.com/problems/zi-fu-chuan-de-pai-lie-lcof/
其实就是全排列题目的变题,这里我们可以利用set集合去重,本质还是dfs+回溯
1 | class Solution{ |
39、数组中出现次数超过一半的数字 https://leetcode-cn.com/problems/shu-zu-zhong-chu-xian-ci-shu-chao-guo-yi-ban-de-shu-zi-lcof/
摩尔投票法:
每次从序列中选出两个不相同的数字删除掉。
最后剩下的一个数字或几个相同的数字,就是出现总和大于一半的数字。
1 | class Solution{ |
40、最小的k个数 https://leetcode-cn.com/problems/zui-xiao-de-kge-shu-lcof/
- 如果我们直接排序,那么时间复杂度为O(nlogn)
1 | class Solution{ |
- 这题我们可以利用堆的性质,从堆中取出最大,最小元素都是O(1)的操作。但是总效率不高
1 | class Solution { |
- 利用计数排序
1 | class Solution { |