回复: 17
跳转到指定楼层
上一主题 下一主题
收起左侧

FB Phone Screen 9/1

全局:

2017(7-9月) 码农类General 硕士 全职@meta - 内推 - 技术电面  | | Other | 在职跳槽

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
就问了一道题BST Two Sum。 先用InOrder加HashSet解决。O(n
您好!
本帖隐藏的内容需要积分高于 188 才可浏览
您当前积分为 0。
使用VIP即刻解锁阅读权限或查看其他获取积分的方式
游客,您好!
本帖隐藏的内容需要积分高于 188 才可浏览
您当前积分为 0。
VIP即刻解锁阅读权限 或 查看其他获取积分的方式
Unlock interview details and practice with AI
Curated Interview Questions from Top Companies
从大到小,然后就和sorted array解法一样了。

评分

参与人数 3大米 +11 收起 理由
rippersean + 1 很有用的信息!
AnthonyNeu + 5 感谢分享!
Sendoh2015 + 5 感谢分享!

查看全部评分


上一篇:9/1 FB电面面经
下一篇:wepay电面1

本帖被以下淘专辑推荐:

全局:
here is the code for two Iterator, Time O(n), Space O(h) as next() need stack:
  1. /**
  2. * Definition for a binary tree node.
  3. * public class TreeNode {
  4. *     int val;
  5. *     TreeNode left;
  6. *     TreeNode right;
  7. *     TreeNode(int x) { val = x; }
  8. * }
  9. */
  10. class Solution {
  11.     public boolean findTarget(TreeNode root, int k) {
  12.         // Time O(n), Space O(h)
  13.         if (root == null)
  14.             return false;
  15.         
  16.         LeftIterator leftIterator = new LeftIterator(root);
  17.         RightIterator rightIterator = new RightIterator(root);
  18.         int left = leftIterator.next();
  19.         int right = rightIterator.next();
  20.         
  21.         while (left < right) {
  22.             int twoSum = left + right;
  23.             if (twoSum == k) {
  24.                 return true;
  25.             }
  26.             if (twoSum < k && leftIterator.hasNext()) {
  27.                 left = leftIterator.next();
  28.             } else if (twoSum < k && !leftIterator.hasNext()) {
  29.                 break;
  30.             }
  31.             if (twoSum > k && rightIterator.hasNext()) {
  32.                 right = rightIterator.next();
  33.             } else if (twoSum > k && rightIterator.hasNext()) {
  34.                 break;
  35.             }
  36.         }
  37.         return false;
  38.     }
  39.         
  40.     class LeftIterator {
  41.         Stack<TreeNode> stack;

  42.         LeftIterator(TreeNode root) {
  43.                 stack = new Stack<TreeNode>();
  44.                 while (root != null) {
  45.                         stack.push(root);
  46.                         root = root.left;
  47.                 }
  48.         }

  49.         boolean hasNext() {
  50.                 return !stack.isEmpty();
  51.         }

  52.         int next() {
  53.                 TreeNode node = stack.pop();
  54.                 int result = node.val;
  55.                 if (node.right != null) {
  56.                         node = node.right;
  57.                         while (node != null) {
  58.                                 stack.push(node);
  59.                                 node = node.left;
  60.                         }
  61.                 }
  62.                 return result;
  63.         }   
  64.     }
  65.    
  66.     class RightIterator {
  67.         Stack<TreeNode> stack;

  68.         public RightIterator(TreeNode root) {
  69.                 stack = new Stack<TreeNode>();
  70.                 while (root != null) {
  71.                         stack.push(root);
  72.                         root = root.right;
  73.                 }
  74.         }

  75.         public boolean hasNext() {
  76.                 return !stack.isEmpty();
  77.         }

  78.         public int next() {
  79.                 TreeNode node = stack.pop();
  80.                 int result = node.val;
  81.                 if (node.left != null) {
  82.                         node = node.left;
  83.                         while (node != null) {
  84.                                 stack.push(node);
  85.                                 node = node.right;
  86.                         }
  87.                 }
  88.                 return result;
  89.         }      
  90. }
  91.    
  92.     }
复制代码

补充内容 (2017-10-2 18:21):
reference: https://www.programcreek.com/201 ... tree-iterator-java/
回复

使用道具 举报

推荐
goha111 2017-9-7 11:39:03 | 只看该作者
全局:
vbnmmnbv 发表于 2017-9-6 23:34
直接traverse bst, 然后binary search另一个node不就可以节省空间了吗

那样时间是n/2*logn 也就是nlogn 不是n
回复

使用道具 举报

推荐
xyz1995 2017-9-6 12:57:30 | 只看该作者
全局:
ilovestat 发表于 2017-9-3 02:32
如何理解  用了两个 BST Iterator 就优化空间了?

同问啊。两个iterator怎么就节省空间了
回复

使用道具 举报

🔗
chris612ku 2017-9-3 02:06:39 | 只看该作者
全局:
谢谢楼主分享
写两种iterator这个想法确实很不错
回复

使用道具 举报

🔗
edyyy 2017-9-3 02:27:25 | 只看该作者
全局:
牛!
谢谢楼主分享。。。。电话面是,是codepad写题目,自己跑test cases吗?
回复

使用道具 举报

🔗
ilovestat 2017-9-3 02:31:51 | 只看该作者
全局:
怎么理解用了两个bst iterator 就优化空间了?
回复

使用道具 举报

🔗
ilovestat 2017-9-3 02:32:37 | 只看该作者
全局:
如何理解  用了两个 BST Iterator 就优化空间了?
回复

使用道具 举报

🔗
 楼主| greatpat 2017-9-3 03:40:09 | 只看该作者
全局:
用codepad写,不用跑test case。Iterator空间是O(logN).
回复

使用道具 举报

🔗
xyz1995 2017-9-6 12:59:17 | 只看该作者
全局:
xyz1995 发表于 2017-9-6 12:57
同问啊。两个iterator怎么就节省空间了

NVM. The space cost of a stack is O(lgn). 打扰了
回复

使用道具 举报

🔗
csddff 2017-9-6 13:22:14 | 只看该作者
全局:
其实可以优化到 O(1)空间,两个 iterator 用 morris traversal 实现就行。面试的时间可以提一下
回复

使用道具 举报

🔗
vbnmmnbv 2017-9-6 23:34:48 | 只看该作者
全局:
直接traverse bst, 然后binary search另一个node不就可以节省空间了吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表