12
返回列表 发新帖
楼主: wannagotousa
跳转到指定楼层
上一主题 下一主题
收起左侧

10.11狗狗onsite

🔗
DylanZhang 2018-10-16 08:42:53 | 只看该作者
全局:
发一个第三题的代码,思路如下:
BFS + DFS,
BFS 第i层,表示最少reverse i edges可以到达的node
DFS 表示以当前点, 按正常path遍历的到的点,
BFS 每次expand都expand直接指向该点node  的所有点 所能到达的点。
时间复杂度是O(E + V);

代码如下:
  1.         static class Node{
  2.                 int key;
  3.                 Set<Node> to;
  4.                 Set<Node> from;
  5.                 public Node(){
  6.                         to = new HashSet<>();
  7.                         from = new HashSet<>();
  8.                 }
  9.         }
  10.        
  11.         public int minReverse(Node source, Node end){
  12.                 Set<Node> visited = new HashSet<>();
  13.                
  14.                 Deque<Node> que = new ArrayDeque<>();
  15.                
  16.                 que.offer(source);
  17.                
  18.                 if(DFS(que, source, visited, end)) return 0;
  19.                
  20.                 int time = 1;
  21.                 while(!que.isEmpty()){
  22.                         int size = que.size();
  23.                         for(int i = 0; i < size; i++){
  24.                                 Node temp = que.poll();
  25.                                 for(Node node : temp.from){
  26.                                         if(DFS(que, node, visited, end)) return time;
  27.                                 }
  28.                         }
  29.                         time++;
  30.                 }
  31.                 return -1;
  32.         }
  33.        
  34.         private boolean DFS(Deque<Node> que, Node node, Set<Node> visited, Node end){
  35.                 if(node == end) return true;
  36.                
  37.                 if(visited.contains(node)) return false;
  38.                
  39.                 que.offer(node);
  40.                 visited.add(node);
  41.                
  42.                 for(Node next : node.to){
  43.                         if(DFS(que, next, visited, end)) return true;
  44.                 }
  45.                
  46.                 return false;
  47.         }
复制代码

回复

使用道具 举报

🔗
DylanZhang 2018-10-16 08:44:21 | 只看该作者
全局:
打了个注释, 供君参考
  1. static class Node{
  2.                 int key;
  3.                 Set<Node> to;
  4.                 Set<Node> from;
  5.                 public Node(){
  6.                         to = new HashSet<>();
  7.                         from = new HashSet<>();
  8.                 }
  9.         }
  10.        
  11.         public int minReverse(Node source, Node end){
  12.                 Set<Node> visited = new HashSet<>();
  13.                
  14.                 Deque<Node> que = new ArrayDeque<>();
  15.                
  16.                 // init the que with nodes that can achieve with 0 reverse
  17.                 if(DFS(que, source, visited, end)) return 0;
  18.                
  19.                 int time = 1;
  20.                 while(!que.isEmpty()){
  21.                         int size = que.size();
  22.                         // for all the node in next layer
  23.                         for(int i = 0; i < size; i++){
  24.                                 Node temp = que.poll();
  25.                                 // only reverse one edge
  26.                                 for(Node node : temp.from){
  27.                                         // if find the end node, return the current the layer
  28.                                         if(DFS(que, node, visited, end)) return time;
  29.                                 }
  30.                         }
  31.                         // use one more reverse edges
  32.                         time++;
  33.                 }
  34.                 return -1;
  35.         }
  36.        
  37.         private boolean DFS(Deque<Node> que, Node node, Set<Node> visited, Node end){
  38.                 // find end
  39.                 if(node == end) return true;
  40.                 // already visited
  41.                 if(visited.contains(node)) return false;
  42.                
  43.                 // add to next layer
  44.                 que.offer(node);
  45.                
  46.                 // make it visited
  47.                 visited.add(node);
  48.                
  49.                 // visited all the node it can achieve without reverse an edge
  50.                 for(Node next : node.to){
  51.                         if(DFS(que, next, visited, end)) return true;
  52.                 }
  53.                
  54.                 // not find end
  55.                 return false;
  56.         }
复制代码
回复

使用道具 举报

🔗
byfwh 2018-10-16 08:57:38 | 只看该作者
全局:
哇 请问怎么明年继续啊 祝offer
回复

使用道具 举报

🔗
 楼主| wannagotousa 2018-10-16 09:10:17 | 只看该作者
全局:
byfwh 发表于 2018-10-16 08:57
哇 请问怎么明年继续啊 祝offer

意思是挂了就来年再战呗.....
回复

使用道具 举报

🔗
hongtunbaobao 2018-10-16 11:43:45 | 只看该作者
全局:
求问什么叫做corner rectangle?
回复

使用道具 举报

🔗
 楼主| wannagotousa 2018-10-16 13:18:02 | 只看该作者
全局:
hongtunbaobao 发表于 2018-10-16 11:43
求问什么叫做corner rectangle?

四个点组成的  不需要填充
回复

使用道具 举报

🔗
b01501085 2018-10-22 04:34:57 | 只看该作者
全局:
請問第四輪樓主什麼思路呢?
回复

使用道具 举报

🔗
tingrany 2018-10-23 04:50:37 | 只看该作者
全局:
请问楼主第四题是用最暴力的方法做吗?
回复

使用道具 举报

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

本版积分规则

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