查看: 1762| 回复: 11
跳转到指定楼层
上一主题 下一主题
收起左侧

[树/链表/图] 求教一个tree的题和其复杂度分析

全局:

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

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

x
leetcode 108题 用recuisive的情况下,time 和space究竟是O(N)还是O(logN)?
有的帖子说是logN因为balanceBST

但是我考虑到递归方法是不是都要遍历所有elements?

谢谢大家~


求点米。。


上一篇:请问一道题是leet里面的嘛?不是怎么解好
下一篇:一个月脱产刷题,面向面试刷题,我应该做array的easy和medium还是所有题目的easy?
 楼主| 乐观的小天使 2019-9-25 02:47:12 | 只看该作者
全局:
Given an array where elements are sorted in ascending order, convert it to a height balanced BST. For this problem, a height-balanced binary tree is defined as a binary tree in which the depth of the two subtrees of every node never differ by more than 1. Example: Given the sorted array: [-10,-3,0,5,9], One possible answer is: [0,-3,9,-10,null,5], which represents the following height balanced BST:       0      / \    -3   9    /   /  -10  5
回复

使用道具 举报

推荐
 楼主| 乐观的小天使 2019-9-25 02:49:23 | 只看该作者
全局:
Luffy_Tse 发表于 2019-9-24 15:28
time是O(N), 因为对于每个element你都要去建立一个TreeNode,也就是你需要遍历所有节点。 extra space是O(l ...

解法的话 我们就先讨论下面这个解法
  1. class Solution:
  2.     def sortedArrayToBST(self, nums):
  3.         if not nums:
  4.             return None
  5.         mid = len(nums) // 2
  6.         root = TreeNode(nums[mid])
  7.         root.left = self.sortedArrayToBST(nums[:mid])
  8.         root.right = self.sortedArrayToBST(nums[mid+1:])
  9.         return root
复制代码
回复

使用道具 举报

推荐
Luffy_Tse 2019-9-25 08:44:00 | 只看该作者
全局:
乐观的小天使 发表于 2019-9-25 02:48
space复杂度是根据层数?为什么不是根据node数呢?因为每个node都要进一次stack吧?

所以我才加了extra space,根据node的话一共有N个node,所以这边的复杂度是O(N),你答案就需要这么多,这个你没办法优化。
你也说对了,是需要stack,这个stack是程序执行的时候recursive call 产生的。但是这个stack的大小并不是随着每个node的生成就一直增加的 -> 这个stack除了push还有pop -> 你的解法return到上一级的时候就是pop。
回复

使用道具 举报

全局:
楼主最后能把题帖一下,这样大家看着方便.
回复

使用道具 举报

🔗
cszj 2019-9-24 15:08:01 来自APP | 只看该作者
全局:
同问,最好贴下题

评分

参与人数 1大米 +1 收起 理由
Wu_kong + 1 赞一个

查看全部评分

回复

使用道具 举报

🔗
Luffy_Tse 2019-9-24 15:28:08 | 只看该作者
全局:
time是O(N), 因为对于每个element你都要去建立一个TreeNode,也就是你需要遍历所有节点。 extra space是O(logN),当然还看你是怎么recursive的,正常的会用left & right idx,也有不正常的直接copy一份subarray。正常解法的话因为是balanceBST,高度就是logN,所以recursive产生的层数就是logN -> extra space O(logN)。
回复

使用道具 举报

🔗
X88 2019-9-24 20:33:44 | 只看该作者
全局:
看起来是avl tree的要求嘛。正常情况下time难道不是O(n logn)吗?avl tree每个node的正常insertion要O(log n),这里有n个nodes.所以总和是O(n log n).

当然如果有优化,更充分利用原array已被sorted的特性,直接生成一个complete tree,那样子可能是O(n). O(log n)不可想像,因为毕竟有n个数要处理啊。
回复

使用道具 举报

🔗
 楼主| 乐观的小天使 2019-9-25 02:48:19 | 只看该作者
全局:
Luffy_Tse 发表于 2019-9-24 15:28
time是O(N), 因为对于每个element你都要去建立一个TreeNode,也就是你需要遍历所有节点。 extra space是O(l ...

space复杂度是根据层数?为什么不是根据node数呢?因为每个node都要进一次stack吧?
回复

使用道具 举报

🔗
Luffy_Tse 2019-9-25 08:48:19 | 只看该作者
全局:
乐观的小天使 发表于 2019-9-25 02:49
解法的话 我们就先讨论下面这个解法
[mw_shl_code=python,true]class Solution:
    def sortedArrayTo ...

这个解法你就要注意一下Python的数组切片是对原数组wrap一下还是说直接copy了一个新的数组。如果是前者的话你的extra space就是O(logN),后者的话就是O(N)。
我的印象里面python数组切片是浅拷贝,所以你给的这个解法应该是O(N) extra space。优化的话建议用idx而不是用切片。
回复

使用道具 举报

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

本版积分规则

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