zoukankan      html  css  js  c++  java
  • LeetCode OJ

    Array和List的区别在于前者可以随机访问,而后者只能顺序访问。对于把排好序的array转成BST,可以用top-down的方式,很直观也很自然,时间复杂度是O(n)。而对于List如果采用同样的方式,每次需要顺序遍历到中间节点,时间复杂度变成O(nlogn),如果换一种思路,down-top,每次把左子树给先生成,然后是根节点,然后再是右子树,则不需要顺序遍历到中间节点,其时间复杂度就降到O(n),下面是两种情况的AC代码:

     1 /**
     2      * Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.
     3      * list can be accessed in order only
     4      * @param head
     5      * @return
     6      */
     7     public TreeNode sortedListToBST(ListNode head){
     8         if(head == null)
     9             return null;
    10         int len = 0;
    11         ListNode temp = head;
    12         while(temp != null){
    13             len ++ ;
    14             temp = temp.next;
    15         }
    16         myHead = head;
    17         return downUpList2BST( 0 , len-1);           
    18     }
    19     ListNode myHead;
    20     private TreeNode downUpList2BST( int start, int end){
    21         if(start>end)
    22             return null;
    23         int mid = (start+end)/2;
    24         TreeNode left = downUpList2BST( start, mid-1);
    25         TreeNode root = new TreeNode(myHead.val);
    26         root.left = left;
    27         myHead = myHead.next;
    28         root.right = downUpList2BST(mid+1,end);
    29         return root;
    30     }
    31     /**
    32      * array can be accessed randomly
    33      * Given an array where elements are sorted in ascending order, convert it to a height balanced BST.
    34      * @param num
    35      * @return
    36      */
    37     public TreeNode sortedArrayToBST(int[] num){
    38         if(num == null || num.length<=0)
    39             return null;
    40         return recSA2BST(0,num.length-1,num);
    41     }
    42     /**
    43      * 
    44      * @param start [
    45      * @param end ]
    46      * @param num
    47      * @return
    48      */
    49     private TreeNode recSA2BST(int start, int end, int[] num){
    50         if(start > end)
    51             return null;
    52         if(start == end)
    53         {
    54             TreeNode temp = new TreeNode(num[start]);
    55             return temp;
    56         }
    57         int mid = (start+end)/2;
    58         TreeNode root = new TreeNode(num[mid]);
    59         root.left = recSA2BST(start, mid-1, num);
    60         root.right = recSA2BST(mid+1,end,num);
    61         return root;
    62     }
    有问题可以和我联系,bettyting2010#163 dot com
  • 相关阅读:
    【转】sql server编写通用脚本自动检查两个不同服务器的新旧数据库的表结构差异
    Pytest 2
    【转】python通过SMTP协议发送邮件失败,报错505或535
    【转】环境搭建之allure的安装配置,及简单使用
    Pytest 1
    替换姓名为隐式
    docker 用户组权限
    安装go环境
    Win10配置WSL2安装Ubuntu,并支持Nvidia CUDA 环境
    miniconda源配置
  • 原文地址:https://www.cnblogs.com/echoht/p/3707990.html
Copyright © 2011-2022 走看看