面经

1. 判断两节点是否是祖先和后代的关系;

思路一:生成父指针,从孩子节点向上寻找,o(n);要求继续优化,可以采用跳表的方式来实现,这里涉及了一个孩子节点和祖先节点的层数问题,例如,输入两节点的层数差,直接利用跳表就很容易到达。

思路二:利用深度优先遍历的思想。

2. 沿着地球表面走,先向南一公里,再向东一公里,再向北走一公里,回到原点,问地球表面有哪些满足这种情况的点?

3. 一个n位数,给定k<n,从中取出k位,使得剩下的数最小(各位相对位置不变)。

思路:采用两种方式,一种是从前往后逐个确定最高位、次高位。。。直到全部确定,就获得了最小值。另一种方式是逐步填充的方法。都是O(N2)的复杂度。

说太高了。。要求继续优化,可以考虑前面的比较为后面的比较提供参考吧,用堆?细节还没想好,但貌似可以优化到O(n*logn)

补充:

可以通过堆来进行优化,规则如下:

如果遇到更小的,清空当前堆,将当前节点作为新的堆的起点;

如果遇到大的,直接加入堆,并调整堆,使之维持最小堆。

以4 1 5 3 2举例 k = 2则,n-k = 3

1. 首先扫描4, 1, 5:

堆中加入4,遇到1,清空堆,当前堆仅包含1;

遇到5,将5加入堆。

选择堆的起点作为最高位,即最高位为1.

此时,堆中还剩下5.

2. 继续扫描3,

与当前堆顶相比较小,清空堆,将3加入堆。

选择堆的起点作为次高位,即次高位为3.

此时,堆为空。

3. 继续扫描2,

新建堆,仅含有元素2.

选择堆的起点作为最低位,即2.

完成。

结果为132.正确。

 

扫描一遍复杂度为O(N),堆的调整为O(N-K),故为O(N*LOG(N))

 

 

 

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页