由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 问道面试题,关于bst的
相关主题
这两道leetcode题有更好的答案吗?二叉树如何判断一个节点是不是在另外两个节点的path上。。。。好像是个老题了。。求解?
新鲜G面筋(2)an interview question
贡献面经 amazon, 虽然面挂了,还是攒点人品一个老题binary tree找 lowest common ancestor 的code (请教
google电面(挂了)Lowest common ancestor of two nodes of Binary Tree
请问如何求binary tree的lowest common ancestor只用加减实现整数除法,到底想考查什么?
讨论 Lowest common ancestor of BST判断BT是否BST?
大概说一下昨天的Google Phone Interview请问二叉搜索树如何找到两个点的最近祖先?
树 inorder下个节点最好办法是啥topcoder好像和面试的不太对路?
相关话题的讨论汇总
话题: nums话题: ancestor话题: bst话题: int话题: reach
进入JobHunting版参与讨论
1 (共1页)
x***i
发帖数: 72
1
给一列整数,比如[5 6 1 2 4 3], 和两个整数,
求的是, 如果先把这一列整数构造成BST, 那么所给的这两个整数的距离 (就是从一
个点走到另一个点经过的边的数目)
比如,给的数是2,6, 那么久返回3
我的做法很普通,就是一个一个整数的插入,生成bst, 然后求两个点的距离(可以先
求lowest ancestor)
但是结果11个test case只通过了8, 不知道是什么test case
整数在0和2^31之间, 整数的数量最多是2^31
请大侠直接,哪里可以优化
update:
谢谢大家回复
其实我的问题是,
有没有不explicitly构造bst也能求解 的办法。 如果input是2^31个integer的话,那
么我的bst就需要2^31 * 12(一个integer加上2个pointer)的memory, 这个大概是24g
,还是最保守的估算。是不是这样用的heap 内存太大,导致大的test case 不过?
b********6
发帖数: 35437
2
After constructing the BST, you just need to find the common ancestor.
There is a similar problem on Leetcode
m*******n
发帖数: 6660
3
 你先搜到lowest common ancestor,然后从common ancestor开始再求距离试试?
s*******n
发帖数: 4
4
没考虑一个是另一个的祖先的情况吧
m*******n
发帖数: 6660
5
共同先祖可以包括本身的。只要判断2个不同时大于或小于root就行。

【在 s*******n 的大作中提到】
: 没考虑一个是另一个的祖先的情况吧
x***i
发帖数: 72
6
这些我都考虑到了

【在 m*******n 的大作中提到】
: 共同先祖可以包括本身的。只要判断2个不同时大于或小于root就行。
a****i
发帖数: 1182
7
有哪些test没过?

【在 x***i 的大作中提到】
: 这些我都考虑到了
x***i
发帖数: 72
8
这个不知道,不给看

【在 a****i 的大作中提到】
: 有哪些test没过?
b********6
发帖数: 35437
9
You probably do not need to construct the BST, and need to use property of
BST to figure out the result.
You know the root value and two points value, so you can traverse the array
from left to right to find the lowest ancestor without actually construct
BST.
To find the distance from ancestor to a node, you can also use the property
of BST.
So it can be an one pass in place solution.
n*****x
发帖数: 686
10
写了一下。不用build tree,找ancestor,求p和q到ancestor的距离即可,只是corner
case实在多,发现bug记得告诉我一声
int BST_distance(vector& nums, int p, int q){
if (p>q) return BST_distance(nums,q,p);
int ancestor=-1, grandpa=-1;
bool left;
for (int i=0; i if (nums[i]>=p && nums[i]<=q){
ancestor=i;
for (int j=i-1, dist=INT_MAX; j>=0; j--){
if (abs(nums[j]-nums[i]) if (nums[j]>nums[i]) left=true;
else left=false;
grandpa = nums[j];
dist = abs(nums[j]-nums[i]);
}
}
break;
}
}
int distp=0, distq=0;
bool reach_p=false, reach_q=false, flag_p=false, flag_q=false;
int turn_p=0, turn_q=0, prev_p=nums[ancestor], prev_q=nums[ancestor];
for (int i=ancestor; i if (nums[i]<=nums[ancestor] && !reach_p){
if (!left && nums[i] continue;
if (!flag_p) {
if (nums[i]<=prev_p) {
distp++;
prev_p = nums[i];
}
if (nums[i] turn_p=nums[i];
flag_p=true;
}
}
else {
if (nums[i]>turn_p && nums[i]<=p) distp++;
}
}
if (nums[i]>=nums[ancestor] && !reach_q){
if (left && nums[i]>grandpa && i!=ancestor && ancestor!=0)
continue;
if (!flag_q) {
if (nums[i]>=prev_q){
distq++;
prev_q = nums[i];
}
if (nums[i]>q) {
turn_q=nums[i];
flag_q=true;
}
}
else {
if (nums[i]=q) distq++;
}
}
if (nums[i]==p) reach_p=true;
if (nums[i]==q) reach_q=true;
if (reach_p && reach_q) break;
}
return distp+distq-2;
}
l******f
发帖数: 19
11
可能没考虑给的数不在BST存在的情况
c*g
发帖数: 634
12
这道题和哪个lc的题相似?
难道和bst如何建的没有关系吗?2到6难道不是4?
3,1,2,4,5,6
1 (共1页)
进入JobHunting版参与讨论
相关主题
topcoder好像和面试的不太对路?请问如何求binary tree的lowest common ancestor
G家onsite面经讨论 Lowest common ancestor of BST
一道msft的题大概说一下昨天的Google Phone Interview
recover binary search tree 常数空间树 inorder下个节点最好办法是啥
这两道leetcode题有更好的答案吗?二叉树如何判断一个节点是不是在另外两个节点的path上。。。。好像是个老题了。。求解?
新鲜G面筋(2)an interview question
贡献面经 amazon, 虽然面挂了,还是攒点人品一个老题binary tree找 lowest common ancestor 的code (请教
google电面(挂了)Lowest common ancestor of two nodes of Binary Tree
相关话题的讨论汇总
话题: nums话题: ancestor话题: bst话题: int话题: reach