第632题:
你有 k 个升序排列的整数数组。找到一个最小区间,使得 k 个列表中的每个列表至少有一个数包含在其中。
我们定义如果 b-a < d-c 或者在 b-a == d-c 时 a < c,则区间 [a,b] 比 [c,d] 小。来源:力扣(LeetCode)
1、寻找最小区间,,这个区间必须长度就小而且起点也最小(就是说有多个区间长度相同时,必须选择起点最小的区间);
长度最小的区间必然是需要我们在计算中找到的,但是我们可以从k个排序数组内找出起点最小的区间 ;
就是从k个排序数组内各自取出最小的数,组成新的区间;
此时区间的长度就是区间内的最大值减去最小值,且这个区间起点最小;
然后就是搜索是否存在比这个区间还小的区间了;
那么就每次将此区间内的最小元素取出,加入这个取出的元素时第 i 个数组内的,那么就将第 i 个数组内的下一个元素加入区间;
这样每次更新这个区间,并且记录最大值和最小值(其实这里的最大值一直是不变的)
更新区间的结束条件就是当当前最小元素是其原来整数数组的最后一个元素时,就是结束的时候。因为之后的操作不可能更改起点了,只会让终点变大,即区间变长。
第114题:
给定一个二叉树,原地将它展开为一个单链表。(来自LeetCode)
1、可得知最后得出的单链表就是二叉树的前序遍历的序列顺序;
只需要递归求出前序遍历,再将前序遍历转化为链表即可。
2、通过迭代求出前序遍历再转化为链表;
3、因为是求前序遍历,所以其实每个节点的左节点的最右边的节点就是右节点代表的右子树的前驱节点;
所以我们可以每次求出右子树的前驱节点(就是这个节点的左节点右子树中的最右边的节点),然后吧右子树接到这个前驱节点的右节点上;
再将这个节点的左子树全都变为这个节点的右子树;
再遍历这个节点的右节点,将它的右子树的前驱节点求出来,重复上面的操作,最后得出一条链表。