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

embedded/2024/10/19 13:18:37/

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

python">import heapq as pq
class Solution:def __init__(self):self.h = []pq.heapify(self.h)def closestKValues(self, root: Optional[TreeNode], target: float, k: int) -> List[int]:if not root: returnself.target = targetself.dfs(root)ans = []for i in range(k):ans.append(pq.heappop(self.h)[1])return ansdef dfs(self, root):if not root: returnpq.heappush(self.h, [abs(self.target - root.val), root.val])self.dfs(root.left)self.dfs(root.right)

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

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

那思路就来了:

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

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

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

python">class Solution:def closestKValues(self, root: Optional[TreeNode], target: float, k: int) -> List[int]:if not root: returnself.ls = []self.dfs(root)leth = len(self.ls)l, r = 0, leth - 1while l < r:mid = l + r >> 1if self.ls[mid] < target:l = mid + 1else:r = midl, r = l-1, lans = []while k and l >= 0 and r < leth:n1 = abs(self.ls[l] - target)n2 = abs(self.ls[r] - target)if n1 <= n2:ans.append(self.ls[l])l -= 1else:ans.append(self.ls[r])r += 1k -= 1if k > 0:if l < 0: ans += self.ls[r:r+k]else: ans += self.ls[l-k+1:l+1]return ansdef dfs(self, root):if not root: returnself.dfs(root.left)self.ls.append(root.val)self.dfs(root.right)

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


http://www.ppmy.cn/embedded/35425.html

相关文章

java设计模式 -- 工厂模式

1、基本概念 工厂模式&#xff08;Factory Pattern&#xff09;是 Java 中最常用的设计模式之一&#xff0c;这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。 工厂模式提供了一种创建对象的方式&#xff0c;而无需指定要创建的具体类。 工厂…

最原理的一集——Mathtype公式编号设置(Mathtype7.8+Word)

版本 Mathtype7.8Office2019 Word 读完本文你将会 随心所欲&#xff0c;想怎么给公式编号就怎么给公式编号&#xff0c;想从(X.1)开始&#xff0c;就从(X.1)开始大概了解Mathtype公式设置原理给作者点赞 如果你想自己跟着文章做的话 请不要在自己的论文里边直接操作&#…

vue用法示例(五)v-model

(1)v-model 文本框的使用 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>Vue 测试实例 - 菜鸟教程(runoob.com)</title> <script src"https://cdn.staticfile.net/vue/2.2.2/vue.min.js"></…

【C++基础】构造函数

一&#xff0c;构造函数概念 概念&#xff1a;函数名与类名相同&#xff0c;且没有返回值类型&#xff0c;这就是构造函数&#xff0c;它承担着类初始化的工作。 构造函数虽然名叫构造&#xff0c;但它并不是开空间创建对象&#xff0c;而是初始化对象。 分类&#xff1a;默…

fabric部署调用合约示例

一 打包智能合约 ①进入fabric-samples文件夹下的chaincode/fabcar/go目录下执行 GO111MODULEon go mod vendor下载依赖&#xff08;文件夹下已经有go.mod&#xff0c;不需要使用go mod init生成该module文件&#xff09;②进入到test-network文件下使用以下命令将二进制文件…

unity生成随机表元素间隔距离相同的点

#region 生成随机点 float minX -800f; float maxX 800f; float minY -400f; float maxY 400f; // 计算相邻点之间的间距 float distanceBetweenPoints 500f; // 生成指定数量的点…

jmeter后置处理器提取到的参数因为换行符导致json解析错误

现象&#xff1a; {"message":"JSON parse error: Illegal unquoted character ((CTRL-CHAR, code 10)): has to be escaped using backslash to be included in string value; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Ill…

vant H5 地址编辑框

vant H5 地址编辑框 效果图&#xff1a; 上代码&#xff1a; <!-- 地区选择 --> <template><div class"page-content"><van-fieldv-model"formNationaAll"is-linkreadonlyrequiredname"国家/地区"label"国家/地…