Python解决侵略性奶牛问题2025 年 1 月 5 日 | 阅读 9 分钟 在此问题中,我们将得到一个整数排序数组。设该数组的大小为 N。整数 N 代表一个隔间的位置。我们将得到另一个整数 K,它代表需要安排的牛的数量。我们在此问题中的任务是为 K 头牛分配数组中的给定隔间,使得任何两头牛之间的最小距离最大化。 让我们来看一些例子来理解这个问题 示例输入: N = 6, K = 4, 数组 = [1, 3, 6, 9, 10, 13] 输出 3 解释: 我们可以将第一头牛放在位置 1,第二头牛放在位置 4,第三头牛放在位置 9。因此,两头牛之间的最大可能最小距离是 3。 输入: N = 7, K = 3, 数组 = [5, 7, 10, 13, 16, 19, 21] 输出 2 解释: 我们可以将第一头牛放在位置 6,第二头牛放在位置 9,第四头牛放在位置 15。因此,两头牛之间的最大可能最小距离是 2。 方法 - 1这是一种暴力方法。在此方法中,我们将首先找到给定隔间位置数组中两头牛之间可能的最大距离。此距离是位于最远位置的隔间与位于最近位置的隔间的差值。就数组而言,这是数组的最大元素和最小元素之间的差值。 由于整数标记了隔间位置,因此任何两个隔间之间的最小距离只能是 1。 让我们先进行代码的模拟运行。
这是上述方法的 Python 代码。 代码 输出 3 时间复杂度: 我们在这个问题中运行了一个嵌套循环。外层循环将运行直到数组的最大元素。因此,时间复杂度将为 O(N * (最大(给定数组))) 辅助空间: 我们没有使用任何额外的空间;因此,空间复杂度是常数。O(1)。 方法 - 2有一种比暴力方法好得多的方法。这种高效的方法将使用二分查找算法。 在暴力方法中,我们从 1 迭代到数组的最大元素。对于每次迭代的每个元素,我们将检查该特定距离是否可以是我们的可能答案。我们可以通过在同一范围(即从 1 到数组的最大元素)上使用二分查找来优化迭代过程。 我们将遵循以下步骤来解决此问题
让我们用一个例子来理解这种方法。 输入: N = 6, K = 4, arr = [1, 3, 6, 9, 10, 13]。 数组的最大元素是 13。因此,我们必须搜索答案的范围是从 1 到 13。 初始 l = 1, h = 13 在第一次迭代中,我们将找到中间元素,它将是 (1 + 13) // 2 = 7。我们可以看到,我们不能以等于 7 的最小距离将所有奶牛放在隔间中。因此,我们将移动到范围的左侧。现在 h = mid - 1 = 6 在第二次迭代中,mid = (1 + 6) // 2 = 3。我们将看到,我们可以以等于 3 的最小距离将奶牛放在给定的隔间中。现在,我们必须找到最优解,这是所有可能解决方案的最大距离。因此,我们将存储此距离并向右移动。现在,l = mid + 1 = 4。 在第三次迭代中,mid = (6 + 4) // 2 = 5。我们可以看到 5 不能是答案。因此,现在我们必须向左移动以找到答案。因此,h 的更新值为 mid - 1,即 4。 在此最后一次迭代中,l = h = 4。因此,mid 值也等于 4。我们可以看到 4 不能是安排奶牛在给定隔间中的最小距离。所以现在我们将向左移动。h 的更新值为 mid - 1 = 3。 由于 l > h,while 循环完成,最终答案是我们第二次迭代中存储的答案,即 3。 这是此方法的 Python 代码 代码 输出 3 时间复杂度: 我们使用了一次二分查找执行,但在每次迭代中,我们都使用了一个线性程序来检查该特定迭代是否给我们一个答案。因此,时间复杂度是 N 乘以 log(N),即 O(N * log(最大(数组))) 辅助空间: 我们没有使用任何额外的空间;因此,空间复杂度是 O(1)。 方法 - 3让我们首先回顾我们的方法,并跟踪我们将达到最高效方法的过程。 在暴力解决方案中,我们遍历从 0 到数组最大元素的范围。我们知道答案只能在此范围内,因为两个隔间的最小距离是 1,而最大元素构成了该距离的上限。 然后,而不是线性遍历此范围,我们使用了二分查找来优化搜索,将时间从 O(N^2) 减少到 O(N * Log N)。 在此方法中,我们将通过修改此范围来进一步优化解决方案。在给定的数组中,任何两个隔间之间的最大可能距离可以是数组的最大元素和最小元素之间的差值。此外,任何两个隔间之间的最小距离必须是 1。因此,我们将执行从 1 到 max_element - min_element 的二分查找,而不是从 0 到 max_element。 我们的隔间数组是一个排序数组。因此,我们可以使用索引而不是 max 和 min 函数,因为最大元素 = array[-1] 且最小元素 = array[0]。所以,最大可能距离 = array[-1] - array[0]。 这没有任何区别;但是,当数组大小非常大时,此方法将消除许多迭代。 假设一个长度为 1000 的数组。其中最小元素是 500,最大元素是 1000,数组 = [500,….1000] N = 1000, K = 3 在普通的二分查找中,搜索范围将是从 0 到 1000。 在当前方法中,搜索范围将是从 1 到 (1000 - 500) = 500,这是先前搜索范围的一半。 这是上述方法的 Python 代码。 代码 输出 3 时间复杂度: 时间复杂度与二分查找的模式相同。二分查找为 Log M,线性函数检查是否可以安排奶牛为 N。因此,O(N * log M),这里 N = 数组的长度。 M = array[-1] - array[0] (最后一个/最大元素 - 第一个/最小元素) 辅助空间: 我们没有使用任何额外的空间;因此,空间复杂度是常数,即 O(1) |
?在开发机器学习模型时,将数据分成两部分至关重要:训练和测试。训练数据的主要目的是帮助理解和掌握模型的假设,而测试数据用于评估...
18 分钟阅读
Python 是一种高级、解释型和动态类型的语言,以其简单性和可读性而闻名。它使用缩进来定义代码块,增强了清晰度。Python 支持多种编程范式,包括过程式、面向对象和函数式编程。其广泛的标准库和活跃的社区使其...
阅读 4 分钟
使用 Python 检测和删除异常值 引言:在数据分析和机器学习领域,异常值可能会严重影响模型的准确性和可靠性。异常值是指与大多数数据显著不同的数据点,常常会扭曲统计分析...
阅读 3 分钟
? Python 提供了许多用于修改数据的模块和类,例如添加或减去天数。其中一个模块是 datetime 模块。Datetime Python 中的 datetime 模块是一个强大的工具,它提供了几个用于处理日期和时间的类。使用此模块,您可以...
阅读 4 分钟
介绍 在高性能计算中,当速度和效率至关重要时,管理 CPU 亲和性就变得至关重要。由于 Python 是一种多功能语言,它提供了有效管理此类低级活动的功能。os.sched_setaffinity() 函数就是这样一种工具。CPU 亲和性工作原理及其如何...
阅读 3 分钟
?引言 csv 模块和用于字符串操作的 StringIO 模块可用于将 Python CSV 字符串转换为数组。首先导入这两个模块。然后,您可以通过使用 CSV 字符串创建一个 StringIO 对象并将其传递给它来读取 CSV 内容...
阅读 4 分钟
理解 Python 的 NumPy.nonzero() 方法 NumPy(Numerical Python 的缩写)是一个强大的 Python 数值计算包。它支持大型多维数组和矩阵,以及一套用于有效控制这些数组的数学函数。NumPy 的许多有用函数之一是 numpy.nonzero()。nonzero() 方法返回...
阅读 4 分钟
Beautifulsoup 是一个强大的 Python 库,专为网页抓取而设计,提供了一种有效的方式来导航、搜索和操作 HTML 和 XML 文档的内容。作为一个解析库,Beautiful Soup 将原始的 HTML 或 XML 代码转换成一个结构化的、树状的表示形式,从而能够...
阅读 6 分钟
Python 是一种灵活而强大的语言,它提供了许多数据结构以及简单的语法。列表和元组是最常用的数据结构,用于存储和操作数据。最常用的两种数据结构……
阅读 4 分钟
简介 Python 是一种流行的语言,用于执行各种任务;它支持多种数据类型,这些数据类型根据其特定用途进行了调整。列表、序列和切片是这些结构中操作和维护数据的基本部分。虽然存在一个...
阅读 6 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India