题目
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如 a b c e s f c s a d e e 矩阵中包含一条字符串”bcced”的路径,但是矩阵中不包含”abcb”路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。
解题思路
回溯法
|
|
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如 a b c e s f c s a d e e 矩阵中包含一条字符串”bcced”的路径,但是矩阵中不包含”abcb”路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。
回溯法
|
|
给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,4,2,6,[2,5,1]}。
使用一个双端队列,队列第一个位置保存当前窗口最大值的下标,每当窗口滑动一次
a. 新增加的值从队尾开始比较,把所有比他小的值丢掉
b. 判断当前最大值是否过期
|
|
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。
a. 最小堆放大数,最大堆放大数,那么两个堆的堆顶就是逼近中位数的数
b. count计数,当两堆数目一样时候,优先放在最小堆
c. 插入最大、最小堆的时候,先到对方的堆中换取合适的值
|
|
给定一颗二叉搜索树,请找出其中的第k大的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。
中序遍历的结果就是二叉搜索树排序之后的结果。
解法一:
递归版本
|
|
|
|
解法二:
非递归版本
|
|
请实现两个函数,分别用来序列化和反序列化二叉树
序列化二叉树:
前序遍历二叉树
反序列化二叉树:
根据“#” 的值判断是否应该构造节点
|
|
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
二叉树层序遍历
|
|
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
解法一:
简洁版本,在数据大的时候效率并不高,因为偶数层的AarrayList总是操作Collections.revers(A)
|
|
解法二:
|
|
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
解法一:
递归版本
|
|
解法二:
非递归版本
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
二叉树的中序遍历要熟悉
该二叉树的中序遍历为:
G D H B E A K C I J F
a. 如果该节点有右子树,那么找该右子树的最左子树节点。
比如输入的节点为C,它有右子树,那么就找其右子树的最左节点 I
b. 如果没有右子树,节点A的父节点的左子树等于该节点A,那么节点A的父节点就是下一节点,否则继续向上搜索
比如输入的节点为H,它的父亲节的左子树不是它本身,那么就要向上搜索,
令pNode = pNode.next,此时PNode = D,它的父节点B就是下一节点
|
|
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
|
|