leetcode常见面试题总结 Python

持续维护中...

1. 寻找 k 个最小数

输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。

示例:

输入:arr = [3,2,1], k = 2

输出:[1,2] 或者 [2,1]

该问题最简单的方式就是直接对 arr 进行排序,然后取前 k 个数值。但其实有时间复杂度更优的方案,就是部分排序,只是找到前 k 个最小值即可。

def findSmallKnum(arr, k):for i in range(k):for j in range(i+1, len(arr)):if arr[i] > arr[j]:arr[i], arr[j] = arr[j], arr[i]return arr[:k]

2. 寻找两个正序数组的中位数

给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的中位数 。算法的时间复杂度应该为 O(log(m+n)) 。

示例:

输入:nums1 = [1,3], nums2 = [2]

输出:2      解释:合并数组 = [1,2,3] ,中位数 2

该问题可以转换为求两个有序数组的第 k 最小值问题,需要用到一个第 k 最小值规律。这个规律为针对两个有序数组 A 和 B,如果 A 中的第 m 个数据 A(m-1) 大于 B 中的第 n 个数据 B(n-1),那可以保证两个有序数组的总数组 C 的第 m+n 个数据 C(m+n-1) 一定大于 B(n-1) 。可以用反正法证明,如果 C(m+n-1) 小于等于 B(n-1),那数组 B 中小于 C(m+n-1) 的数据个数一定小于等于 n-1,数组 A 中小于 C(m+n-1) 的数据个数一定小于等于 m-1,所以在总数据 C 中小于 C(m+n-1) 的个数小于 m+n-2 (m-1 与 n-1 不能同时获取),而实际情况是小于 C(m+n-1) 的数据个数是 m+n-1,所以证明结束。所以解该题目的思路为,假定在总数组中中位数是第 k 个数据,那就分别在 nums1 和 nums2 中比较第 k/2 个数值,然后基于第 k 最小值规律可以从某数组中剔除 k/2 个数据,然后接下来继续寻找剩余两个数组的第 k/2 最小值,以此类推,寻找 k/4、k/8、k/16...,直至 1 或者某数组中所有数据均已被剔除,所以时间复杂度可以做到 O(log(m+n))。但实际编程中需要考虑 k 是整数并非浮点数,如何取整和处理边界条件,以及数据索引与数据个数之间的关系。

def findMedianSortedArrays(nums1, nums2):def getK2(k):                                          # 定义一个函数实现查询的第 k 和 k+1 大的值,k 值不能太大id1, id2 = 0, 0                                    # 数组 1 和 2 的寻找起始索引,包含当前索引位置while True:                                        # id1 和 id2 是起始索引,k 是第几个值,所以 k 在变索引时需要减一# 终止条件if id1 == m:                                   # 数组 1 中的值已被全部剔除return nums2[id2+k-1], nums2[id2+k]        # 在数组 2 中寻找起于 id2 的第 k 个值,k 变索引需要减一if id2 == n:                                   # 数组 2 中的值已被全部剔除return nums1[id1+k-1], nums1[id1+k]        # 在数组 1 中寻找起于 id1 的第 k 个值,k 变索引需要减一if k == 1:                                     # k 等于 1 时,第 k 最小值,只需要找 min(nums1[id1],nums2[id2])if nums1[id1] < nums2[id2]:                # 但第 k+1 个值比较麻烦,需要增加一些判断条件,分类处理if id1 == m-1:return nums1[id1], nums2[id2]else:return nums1[id1], min(nums1[id1+1], nums2[id2])else:if id2 == n-1:return nums2[id2], nums1[id1]else:return nums2[id2], min(nums2[id2+1], nums1[id1])# 二分法遍历newid1 = min(id1+k//2-1, m-1)                  # 数组 1 需要判断的数值索引,对 k 的奇偶没有要求,但必须减一。如果不减一,会造成多剔除数据,漏掉结果,原因是 k//2 是第几个数不是索引newid2 = min(id2+k//2-1, n-1)                  # 变成索引需要减一。也不能减 2,原因是 k 大于等于 2,当 K==2 时,k//2-2 变负值了,其需要大于等于零p1, p2 = nums1[newid1], nums2[newid2]          # 根据第 k 最小值订定理,其实上面语句需要保证 [(id1+k//2-x)+1]+[(id2+k//2-x)+1] 小于等于 id1+id2+k,所以 x>=1,这用来解释为何减一,这是本代码最难的部分!!!if p1 <= p2:                                   # 若数组 1 的当前判断值较小,则说明判断下标以及之前的值全部都在中值左边,全部排除k -= newid1 - id1 + 1                      # k 需要减去之前剔除的值的数量id1 = newid1 + 1                           # 数组 1 从去除的索引后一位重新开始else:                                          # 同理k -= newid2 - id2 + 1id2 = newid2 + 1m,  n = len(nums1), len(nums2)   # 数组 1,数组 2 的长度Length = m + n                   # 两个数组总长度v1, v2 = getK2(Length//2)        # 通过 getK2 函数获取 Length//2 和 Length//2+1 对应的数值if Length%2 == 1:                # 若总数组长度为奇数,则使用 Length//2+1 对应的数值return v2else:                            # 若总数组长度为偶数,则使用 Length//2 和 Length//2+1 对应数值的均值return (v1+v2)/2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/641588.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring/Spring boot项目接入traceId

简介 分布式系统中&#xff0c;由多个服务构成&#xff0c;每个请求路由过来后&#xff0c;会在多个服务中留下追踪ID&#xff0c;可以基于此追踪ID排查问题&#xff0c;分析请求的执行链路。 业界也有比较成熟的链路追踪ID方案&#xff0c;比如Skywalking&#xff0c;它基于…

python 抓包tcp数据拷贝转发

在Python中&#xff0c;你可以使用scapy库进行抓包&#xff0c;使用shutil或io库进行数据的拷贝&#xff0c;以及使用socket库进行数据转发。下面是一个简单的示例&#xff0c;展示了如何进行这些操作&#xff1a; 首先&#xff0c;你需要安装必要的库。你可以使用pip来安装它…

Java算法 leetcode简单刷题记录4

Java算法 leetcode简单刷题记录4 买卖股票的最佳时机&#xff1a; https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/ 笨办法&#xff1a; 记录当天的值及之后的最大值&#xff0c;相减得到利润&#xff1b; 所有的天都计算下&#xff0c;比较得到利润最大值&…

PyTorch视觉工具箱:图像变换与上采样技术详解(1)

目录 Pytorch中Vision functions详解 pixel_shuffle 用途 用法 使用技巧 注意事项 参数 数学理论公式 示例代码及输出 pixel_unshuffle 用途 用法 使用技巧 注意事项 参数 数学理论公式 示例代码及输出 pad 用途 用法 使用技巧 注意事项 参数 示例代码…

智能机器人与旋量代数(9)

Chapt 3. 螺旋运动与旋量代数 3.1 螺旋运动 螺旋运动是关于一条空间直线的一个旋转运动&#xff0c;并伴随沿此直线的一个平移。是一种刚体绕空间轴 s s s旋转 θ \theta θ角&#xff0c;再沿该轴平移距离 d d d的复合运动&#xff0c;类似螺母沿螺纹做进给运动的情形。 一…

2024年【焊工(初级)】考试内容及焊工(初级)新版试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 焊工&#xff08;初级&#xff09;考试内容参考答案及焊工&#xff08;初级&#xff09;考试试题解析是安全生产模拟考试一点通题库老师及焊工&#xff08;初级&#xff09;操作证已考过的学员汇总&#xff0c;相对有…

docker 使用 vcs/2018 Verdi等 eda 软件

好不容易在ubuntu 安装好了eda软件&#xff0c;转眼就发现了自己的无知。 有博主几年前就搞定了docker上的EDA工具。而且更全&#xff0c;更简单。只恨自己太无知啊。 Synopsys EDA Tools docker image - EDA资源使用讨论 - EETOP 创芯网论坛 (原名&#xff1a;电子顶级开发网…

python解决从有序数组中寻找中位数

如果给定两个长度分别是m和n的有序数组array1和array2&#xff0c;需要对这两个有序数组找出其中的中位数&#xff0c;需要保证时间复杂度是O(long(min(m,n))&#xff0c;空间复杂度是O(1)。如下例子&#xff1a; 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#…

【教程】混淆Dart 代码

什么是代码混淆&#xff1f; 代码混淆是一种将应用程序二进制文件转换为功能上等价&#xff0c;但人类难于阅读和理解的行为。在编译 Dart 代码时&#xff0c;混淆会隐藏函数和类的名称&#xff0c;并用其他符号替代每个符号&#xff0c;从而使攻击者难以进行逆向工程。 Flut…

ChatGPT和文心一言哪个更好用?

目录 一、ChatGPT和文心一言大模型的对比分析 1.1 二者训练的数据情况分析 1.2 训练大模型数据规模和参数对比 1.3 二者3.5版本大模型对比总结 二、ChatGPT和文心一言功能对比分析 2.1 二者产品提供的功能情况分析 2.2 测试一下各种功能的特性 2.2.1 文本创作能力 2.2…

Redis通过dump.rdb恢复数据

Redis通过dump.rdb恢复数据 注意3个配置参数&#xff1a; appendonly no dbfilename dump.rdb dir /var/lib/redisappendonly 设置成no&#xff0c;redis启动时会把/var/lib/redis该文件夹可指定目录下的dump.rdb 中的数据恢复。dir 和dbfilename设置rdb文件名称 都可以设置。…

电脑提示“No Boot Device”怎么办?

在Windows 11/10/8/7启动时遇到错误如“No Boot Device Found”和“未找到引导设备硬盘3F0”时&#xff0c;会导致电脑无法正常开机。那么&#xff0c;No Boot Device错误该怎么修复呢&#xff1f;下面我们就来了解一下。 修复 1. 检查启动顺序并将BIOS的设置重置为默认值 为…

非线性最小二乘问题的数值方法 —— 狗腿法 Powell‘s Dog Leg Method (II, Python 简单实例)

Title: 非线性最小二乘问题的数值方法 —— 狗腿法 Powell‘s Dog Leg Method (II, Python 简单实例) 姊妹博文 非线性最小二乘问题的数值方法 —— 狗腿法 Powell‘s Dog Leg Method (I - 原理与算法) 0.前言 本篇博文作为对前述 “非线性最小二乘问题的数值方法 —— 狗腿法…

【mars3d】内置的右键测量菜单单击关闭按钮无法关闭测量结果说明

1.【mars3d】内置的右键测量菜单单击关闭按钮无法关闭测量结果说明 2.内置的右击地图查看此处坐标&#xff0c;出现的弹框按钮同样无法关闭的解决方案。 解决说明&#xff1a; 1.这个问题和mars3d没有关系&#xff0c;是and那边的问题&#xff0c;需要尝试固定下vue版本3.3.0或…

测试 yolov8 分割模型 边缘检测

发现 cfg/default.yaml 参数 mask_ratio 等于4 直接训练如下边缘分割标签,推理时mask 稀疏&#xff0c;训练时分数偏低,mask_ratio 改为1训练时打印的mask 的 P指标一直为0,将imgsz原图size 训练分数也不高 标注用的是labelme多边形 阅读源码发现可能是因为mask缩放导致 且出现…

springboot配置项动态刷新

文章目录 一&#xff0c;序言二&#xff0c;准备工作1. pom.xml引入组件2. 配置文件示例 三&#xff0c;自定义配置项动态刷新编码实现1. 定义自定义配置项对象2. 添加注解实现启动时自动注入3. 实现yml文件监听以及文件变化处理 四&#xff0c;yaml文件转换为java对象1. 无法使…

IPv4 开始收费!新的 IT 灾难?

对于想要继续使用公共IPv4地址的用户而言&#xff0c;他们主要靠回收和未使用地址段的释放才能用上IPv4&#xff0c;其中这些地址要么来自倒闭的组织&#xff0c;要么来自于那些已经迁移到IPv6时不再需要的地址。 不难想象&#xff0c;获取日益稀缺的IPv4中间过程变得复杂&…

Python 第四十三章 MYSQL 补充

多表查询 1.笛卡尔积:将两表所有的数据一一对应,生成一张大表 select * from dep,emp; #两个表拼一起 select * from dep,emp where dep.id emp.dep_id; #找到两表之间对应的关系记录 select * from dep,emp where dep.id emp.dep_id and dep.name技术; #筛选部门名称为技…

web架构师编辑器内容-快捷键操作的实现

快捷键操作的需求 元素选择 前提都是在元素被选中的情况下 拷贝图层 - ⌘C / CtrlC &#xff1a; 新建当前选择的元素的一个数据结构粘贴图层 - ⌘V / CtrlV &#xff1a; 将新建的元素添加到 components 数组中删除图层 - Backspace / Delete &#xff1a; 在 components 数…

接口测试之webservice

什么是Webservice Web service是一个平台独立的&#xff0c;低耦合的&#xff0c;自包含的、基于可编程的web的应用程序&#xff0c;可使用开放的XML&#xff08;标准通用标记语言下的一个子集&#xff09;标准来描述、发布、发现、协调和配置这些应用程序&#xff0c;用于开发…