在 Python 中查找旋转排序数组中的元素2024 年 8 月 29 日 | 阅读 6 分钟 使用二分查找,我们可以在 O(log(n)) 的时间复杂度内找到给定排序数组或列表中的元素,其中 n 是列表中数字的数量。现在让我们将这个排序数组或列表在任意一个支点上旋转。但是,我们不知道支点,也不能在操作中使用它。例如,如果数组 = [1, 2, 3, 4, 5, 6, 7] 在支点 3 处旋转,那么新数组将是 array_rotated = [4, 5, 6, 7, 1, 2, 3]。 本教程的问题陈述是在旋转排序数组中查找一个特定的数字。同样在 O(log(n)) 的时间复杂度内。 示例输入和输出输入: array = [4, 6, 8, 10, 12, 14, 0, 2]; target = 6 输出: 存在于索引 1 输入: array = [8, 10, 12, 14, 0, 2, 4, 6]; target = 23 输出: 在数组中未找到 输入: array = [20, 30, 40, 0, 10]; target = 40 输出: 存在于索引 2 假设: 我们将假设数组包含唯一的元素,即数组中没有重复的元素。 朴素方法在此方法中,我们将首先尝试找到旋转支点。然后将原始数组分成两个子数组。我们将在这些已排序的子数组中执行二分查找。查找支点元素的逻辑是,它是唯一一个当我们从左向右遍历数组时,会比其最后一个元素小的元素。使用此逻辑,我们将找到一个支点。这两个子数组将是单独排序的数组。因此,我们可以在这两个子数组上应用二分查找并找到元素。 算法 输入数组 = [4, 5, 6, 7, 1, 2, 3] 我们需要搜索的元素 = 2 1) 找到数组的支点。将数组分成两个子数组。(支点 = 3) (元素 7 的索引)。 2) 现在,调用二分查找函数并将两个子数组传递给函数。 (a) 如果我们要搜索的元素大于数组的第 0 个元素,则应用此逻辑 (b) 否则,我们将搜索右子数组 (由于 2 小于第 0 个元素,即 4,因此将在右子数组中搜索该元素) 3) 如果我们能在选定的子数组中找到该元素,则返回该元素的索引。否则返回 -1。 我们将用 Python 实现这个算法 代码 输出 The pivot of the array is: 3 The index of 2 in the [4, 5, 6, 7, 1, 2, 3] array is: 5 复杂度分析时间复杂度:此程序的 time complexity 为 O(log n)。 我们首先使用二分查找来查找支点,然后使用二分查找在子数组中查找元素。 空间复杂度:此程序占用 O(1) 的额外内存空间。我们没有使用任何额外的空间来存储数组。 更好的解决方案方法:与其应用两次二分查找,不如在一次二分查找中解决问题。我们将修改算法以获得所需的结果。我们将创建一个递归函数,该函数将接受低高索引指针、数组和目标元素。该函数将返回目标元素在旋转排序数组中的索引。
下面是上述思想的实现 代码 输出 Index: 2 复杂度分析时间复杂度:此程序的 time complexity 为 O(log n)。 我们使用单个二分查找算法,因此时间复杂度为 O(log n)。 空间复杂度:O(1)。我们没有使用任何额外的内存空间。 如何处理重复项?如果数组包含重复元素,则不可能在 O(log n) 的时间复杂度内搜索索引。例如,如果我们想在数组 [1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1] 中搜索 0 的索引,那么我们不知道该元素可能存在于哪个子数组中。由于我们无法决定子数组,因此我们必须搜索整个数组,因此时间复杂度为 O(n)。 |
?现有的Python包总数超过20万个(这个数字仅包括存储在PyPI(官方Python包索引)上的包)。Python包提供了一种用户友好且有效的解决方案,可以解决各个领域的挑战性问题,包括科学计算、数据可视化,...
阅读 6 分钟
Python 中的哈希映射 - 冲突、负载因子和重新哈希简介:在本教程中,我们学习 Python 中的哈希映射,包括冲突、负载因子和重新哈希。哈希映射是一种索引数据结构。它以键值对的形式存储数据。在数据结构中,数据...
阅读 17 分钟
你不需要解密每一个字节来获取中间的某些信息。当使用 AES CTR 模式时,我们使用提供的加密密钥和 IV 生成一些随机位。我们用这些随机位与我们的字符串进行异或运算。这会生成一个文本...
阅读 6 分钟
Pip 是一个包管理系统,用于安装和管理用 Python 编写的软件包。它代表“Pip Installs Packages”,它使我们能够轻松下载、升级和管理 Python 项目中使用的库和依赖项。使用 pip,我们可以从...
阅读 6 分钟
在下面的教程中,我们将学习如何借助 Python 编程语言的 Tkinter、OS 和 Shutil 模块构建一个基于 GUI 的文件浏览器。这个项目适合初学者,我们所需要的只是与所有这些模块相关的一些简要知识...
34 分钟阅读
简介 列表被认为是 Python 编程语言中最灵活的数据结构之一。另一方面,二维列表,或称 2D 列表,通常被称为列表的列表,是一个列表对象,其中每个元素...
阅读9分钟
在本教程中,我们将学习如何使用 AST 来理解代码。什么是 AST 模块?Python 中的 AST(抽象语法树)模块提供了在结构级别上与 Python 代码交互的工具。抽象语法树是树状表示...
阅读 6 分钟
在 CPU 中,调度方法选择进程的执行顺序,从而管理等待时间。其中一种方法被称为“最短作业优先”(SJF)或“最短作业”。该算法将最短的执行时间赋予进程...
5 分钟阅读
特殊字符是任何非字母数字字符或空格字符的字符。一些特殊字符的例子包括标点符号、符号和控制字符。一些特殊字符本身可能在正则表达式语法中有特殊含义。例如,点字符(.)是一个通配符,它……
阅读 2 分钟
在 Python 中,分类变量是一种可以取有限数量可能值之一的变量。这些值通常是非数字的,用于表示分为类别或组的数据。分类变量也称为名义变量...
阅读 3 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India