📣 独立日限时特惠: VIP通行证立减$68
查看: 918| 回复: 3
跳转到指定楼层
上一主题 下一主题
收起左侧

[学Java/C#] 222的終極解法,求時間複雜度

全局:

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

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

x
  1. class Solution {

  2.      K = 最後一排滿打滿算的全部元素個數D = 樹的層數
  3.          
  4.   // O(lgK * D)  ??????
  5.    
  6.   public int countNodes(TreeNode root) {
  7.    
  8.         if(root == null) return 0;

  9.         int depth = countDepth(root);

  10.         // 找到最後一層的所有位置(滿打滿算)
  11.         int left = 0;
  12.         int right = (int) Math.pow(2, depth - 1) - 1;

  13.         while (left + 1 < right) {

  14.             int mid = left + (right - left) / 2;

  15.             if (  exist(mid, depth, root)  ) {   

  16.               left = mid;

  17.             } else{
  18.                
  19.               right = mid;
  20.             }

  21.         }
  22.          
  23.         if( exist(right, depth, root ) ) {
  24.             
  25.             return (int) Math.pow(2, depth - 1) + right;
  26.             
  27.         } else {
  28.             
  29.             return (int) Math.pow(2, depth - 1) + left;
  30.         }
  31.   }
  32.       
  33.   // Count the tree depth   
  34.   public int countDepth(TreeNode root){  
  35.   
  36.         if(root == null) return 0;
  37.    
  38.         if(root.left == null) return 1;
  39.          
  40.         return countDepth(root.left) + 1;
  41.   }
  42.      
  43.   // see if it is exist   
  44.   public boolean exist(int Target, int D, TreeNode node){
  45.   
  46.      int L = 0;
  47.       
  48.      int R = (int) Math.pow(2, D - 1) - 1;
  49.       
  50.      // 用L和R是否重疊來判斷,是否到達最後一層
  51.      while( L < R) {
  52.       
  53.               int mid2 = L +  (R - L)/2;
  54.    
  55.               if( Target <= mid2 ) {
  56.                
  57.                     R = mid2 ;
  58.                     node = node.left;
  59.               }
  60.          
  61.               if( Target > mid2 ) {

  62.                     L = mid2 + 1;
  63.                     node = node.right;
  64.               }
  65.      }
  66.    
  67.       
  68.      /* 用層數來判斷是否到達最後一層
  69.       int currentLevel = 1;
  70.       
  71.       while( currentLevel < D) {            

  72.           int mid2 = L +  (R - L)/2;

  73.           if( Target > mid2 ) {

  74.             L = mid2;
  75.             node = node.right;
  76.           }

  77.           if( Target <= mid2 ) {

  78.               R = mid2;
  79.               node = node.left;
  80.           }

  81.           currentLevel++;
  82.        }
  83.      */
  84.       
  85.     return node != null;
  86.   }
  87. }



复制代码





這個雙層 binary search 的解法,速度上pk掉所有其他解法。但我算不出他的時間複雜度。

求大神賜教!

我已陣亡。

上一篇:一道题求解惑
下一篇:Google Mock Interview
🔗
usr_opta 2021-1-2 14:48:03 | 只看该作者
全局:
countNodes 二分调用 exist O(log) 次,每次 exist 运行从根到底 O(log) 层,总计O((log n)^2),介于 O(log n) 和 O(n) 中间。
回复

使用道具 举报

🔗
 楼主| techDiscussion 2021-1-2 15:03:03 | 只看该作者
全局:
usr_opta 发表于 2021-1-2 14:48
countNodes 二分调用 exist O(log) 次,每次 exist 运行从根到底 O(log) 层,总计O((log n)^2),介于 O(log ...

可以再詳細一點嗎?  

第一次二分是Lg N  -->  N 是2^d     d是層數

第二次二分是d,  d是層

所以我覺得是  d*lg (2^d) = d^2???




回复

使用道具 举报

🔗
usr_opta 2021-1-3 03:08:10 | 只看该作者
全局:
techDiscussion 发表于 2021-1-2 15:03
可以再詳細一點嗎?  

第一次二分是Lg N  -->  N 是2^d     d是層數

一样的,我说的n是节点数量,你的d是层数,d=O(log n)
O((log n)^2) 等价于 O(d^2)
回复

使用道具 举报

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

本版积分规则

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