当前位置:   article > 正文

尊享面试100(272.最接近的二叉树搜索值|| python)

尊享面试100(272.最接近的二叉树搜索值|| python)

刚开始想着用最小堆,把每个元素都加进去,然后找出最小的k个值,复杂度应该是(n+klogn)

  1. import heapq as pq
  2. class Solution:
  3. def __init__(self):
  4. self.h = []
  5. pq.heapify(self.h)
  6. def closestKValues(self, root: Optional[TreeNode], target: float, k: int) -> List[int]:
  7. if not root: return
  8. self.target = target
  9. self.dfs(root)
  10. ans = []
  11. for i in range(k):
  12. ans.append(pq.heappop(self.h)[1])
  13. return ans
  14. def dfs(self, root):
  15. if not root: return
  16. pq.heappush(self.h, [abs(self.target - root.val), root.val])
  17. self.dfs(root.left)
  18. self.dfs(root.right)

题目要求在(n)的复杂度下解决。

终于发现,题目给的是二叉搜索树,特点是:左子节点<当前节点<右子节点

那思路就来了:

1.把所有节点都放在列表ls中

2.找到第一个大于target的值

3.双指针,一个指针向左走,一个指针向右转,距离target最小的节点的值保留。

  1. class Solution:
  2. def closestKValues(self, root: Optional[TreeNode], target: float, k: int) -> List[int]:
  3. if not root: return
  4. self.ls = []
  5. self.dfs(root)
  6. leth = len(self.ls)
  7. l, r = 0, leth - 1
  8. while l < r:
  9. mid = l + r >> 1
  10. if self.ls[mid] < target:
  11. l = mid + 1
  12. else:
  13. r = mid
  14. l, r = l-1, l
  15. ans = []
  16. while k and l >= 0 and r < leth:
  17. n1 = abs(self.ls[l] - target)
  18. n2 = abs(self.ls[r] - target)
  19. if n1 <= n2:
  20. ans.append(self.ls[l])
  21. l -= 1
  22. else:
  23. ans.append(self.ls[r])
  24. r += 1
  25. k -= 1
  26. if k > 0:
  27. if l < 0: ans += self.ls[r:r+k]
  28. else: ans += self.ls[l-k+1:l+1]
  29. return ans
  30. def dfs(self, root):
  31. if not root: return
  32. self.dfs(root.left)
  33. self.ls.append(root.val)
  34. self.dfs(root.right)

复杂度为(n+logn+k),四舍五入满足题目的条件。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/563494
推荐阅读
相关标签
  

闽ICP备14008679号