最大和子数组问题2024 年 8 月 29 日 | 阅读 12 分钟 在这个问题中,我们将得到一个整数数组,我们需要找到给定数组所有可能子数组中和最大的子数组。 让我们看一个例子来理解这个问题。 输入: 数组 = [-2, -3, 4, -1, -2, 1, 5, -3] 输出 7 这个数组的所有子数组中,最大和是 7。 暴力破解法解决这个问题的最简单方法是计算给定数组所有可能子数组的和,比较它们,并找到最大的可能和。使用这种方法解决此问题需要 3 个循环。第一个或最外层循环将标记每个子数组的开始。此循环将遍历数组的所有元素。第二个循环将标记子数组的结束。对于每个子数组,结束索引将等于 n - 1,其中 n 是给定数组中元素的数量。最后一个循环将计算由外部两个循环标记的起始索引和结束索引之间每个可能的子数组的和。在计算和的同时,我们将不断检查最大和,因此,最终我们将得到最大的可能子数组和。 以下是我们使用暴力方法解决此问题将遵循的步骤:
代码 输出 The maximum sum of a subarray is 7 时间复杂度: 由于我们使用了三个 for 循环,因此此方法的时间复杂度将是立方级的。因此,最终时间复杂度为 O(n^3),其中 n 是数组中给定的元素数量。 空间复杂度: 我们在此方法中没有使用任何额外的空间;因此,空间复杂度是常数,即 O(1)。 最优方法立方时间复杂度是暴力方法的主要缺点。然而,我们可以稍微优化此方法,将时间复杂度从立方级降低到二次级。正如我们可以在第三个循环内部观察到的那样,我们正在计算以下子数组的和:array[s : s+1]、array[s : s+2]、array[s : s+3],依此类推,直到 array[s : e]。因此,我们正在重新计算前一个子数组的和,然后添加当前元素。因为 sum(array[s : s+3]) = sum(array[s : s+1]) + array[s+2]。 以下是我们将遵循的步骤:
代码 输出 The maximum sum of a subarray is 7 Kadane 算法为了解决这个问题,我们将使用著名的 Kadane 算法。在这个算法中,我们将维护两个变量。第一个变量将存储以任何特定索引结尾的连续子数组的最大和值。我们称之为 max_end_here。第二个变量将存储我们目前遇到的所有单个子数组的最大和。我们称之为 max_till_now。在每次迭代中,我们将检查 max_end_here 的值是否超过 max_till_now 的值。如果是,我们将更新 max_till_now 的值。这样,在循环结束时,我们将得到数组中子数组可能拥有的最大和。 用两句话总结 Kadane 算法:-
忽略和为负数的子数组是因为,例如,数组是 [2, 3, -6, 10, 1]。子数组 [2, 3, -6] 的和为 -1。现在,子数组 [10, 1] 的和为 11。现在很清楚:将子数组 [2, 3, -6] 添加到子数组 [10, 1] 没有任何意义,因为它只会减少和。 所以这是我们的伪代码 1. 初始化变量 max_till_now = -float("inf") max_end_here = 0 2. 遍历数组中的每个项 (a) max_end_here = max_end_here + array[i] (b) 如果 (max_till_now < max_end_here) max_till_now = max_end_here (c) 如果 (max_end_here < 0) max_end_here = 0 返回 max_till_now 让我们通过一个例子来理解其功能。我们将在数组 array = [-2, -4, 5, -1, -3, 1, 5, -2] 上进行代码演练。 3. 初始化两个主要变量 max_till_now = -float("inf") max_end_here = 0 4. 启动循环 对于 i = 0, array[0] = -2 max_end_here = max_end_here + (-2) 将 max_end_here 的值设置为 0,因为 max_end_here < 0 并将 max_till_now 设置为 -2 对于 i=1, array[1] = -4 max_end_here = max_end_here + (-4) 由于 max_end_here < 0 且 max_till_now = -2, max_till_now 将变为 -6 将 max_end_here 的值设置为 0,因为 max_end_here < 0 对于 i = 2, array[2] = 4 max_end_here = max_end_here + (5) max_end_here = 5 max_till_now 现在设置为 5,因为 max_end_here 的值大于 max_till_now max_till_now = 5 对于 i = 3, array[3] = -1 max_end_here = max_end_here + (-1) max_end_here = 4 不改变 max_till_now 的值,因为它大于 max_end_here 对于 i = 4, array[4] = -3 max_end_here = max_end_here + (-3) max_end_here = 1 对于 i = 5, array[5] = 1 max_end_here = max_end_here + (1) max_ending_here = 2 对于 i = 6, array[6] = 5 max_end_here = max_end_here + (5) max_end_here = 7 max_till_now 将现在设置为 7,因为 max_end_here 的值大于 max_till_now max_till_now = 7 对于 i = 7, array[7] = -2 max_end_here = max_end_here + (-2) max_end_here = 6 最后,max_till_now 的值就是我们的答案。因此,初始数组子数组的最大和是 7。 以下是我们应遵循的步骤
以下是上述算法的 Python 代码。 代码 输出 The maximum contiguous sum is 7 时间复杂度: 我们使用线性循环遍历数组元素;因此,时间复杂度为 O(N)。 辅助空间: 除了存储变量之外,我们没有使用任何额外的内存;因此,空间复杂度是常数,即 O(1)。 Kadane 算法的递归函数Kadane 算法的基本策略是使用“分而治之”。当我们使用递归函数实现此函数时,我们将把数组分解成更小的子数组。然后,我们将递归调用该函数,以找到每个子数组的最大和。最后一步是结合子问题的单个解决方案并找到最终答案。从而找到任何给定数组子数组的最大和。 现在,我们将看到使用递归函数查找任何给定整数数组子数组最大和的算法。
以下是上述递归算法实现的 Python 程序 代码 输出 The maximum sum of a subarray is 7 下一个主题使用 Python 进行双边滤波 |
本文将教我们如何使用 Python 跟踪我们想要购买的亚马逊商品。我们经常在商品价格低于特定限制时购买,以保持其可负担性并增加我们的储备金。在这个项目中,我们将精确地执行...
阅读 4 分钟
在数据科学和机器学习中,我们经常遇到一个术语,称为不平衡数据分布,通常发生在其中一个类别的观测值远高于或低于其他类别时。机器学习算法通常通过减少...来提高准确性。
11 分钟阅读
在本教程中,我们将学习一个 Python 程序来查找给定数字是否是强数。什么是强数?强数是一个特殊的数字,其所有数字阶乘之和应等于数字本身。要找到一个...
5 分钟阅读
在本教程中,我们将学习如何检查给定的数字是否为斐波那契数。在这里,我们有一个数字“n”,我们必须检查它是否为斐波那契数。斐波那契数列的起始数字是:0, 1, 1, 2, 3,...
阅读 3 分钟
在本教程中,我们将学习如何使用 Matplotlib 在子图中包含图例。创建图后可以使用 legend() 函数添加图例。语法:子图中图例的语法是:axes[position].legend(loc = ''),其中 loc 用于位置。方法:以下是我们将介绍的方法...
阅读 3 分钟
本教程将演示如何使用 PyQt5 构建计时器应用程序。计时器确实是一种特殊类型的时钟,用于测量某些时间间隔;要使用它,请从提供的时间开始倒计时,直到它等于零。实现 GUI 的步骤:制作...
阅读 3 分钟
目前有超过 500 种编程语言,而且每天都有新的语言被创造出来。当然,其中许多是重叠的,并且只打算在理论或实验室情况下应用。然而,决定在企业和日常编码中使用的计算机语言...
阅读 10 分钟
企业在全球范围内使用 Python 构建 Web 应用程序、分析数据、通过 DevOps 自动化操作以及构建可靠、可扩展的企业应用程序。Python.org 的维基上列出了大量使用 Python 的公司,Real Python 的博客上也有许多主要由 Python 驱动的公司的完整介绍。无论是用于...
阅读 8 分钟
在本教程中,我们将讨论用户如何编写Python程序来计算给定字符串对中匹配字符的数量。我们将传入一对非空字符串。程序将计算该对中匹配字符的数量...
阅读 4 分钟
Python2.x Python 2.x 是流行编程语言 Python 的一个版本。它于 2000 年首次发布,尽管更新版本 Python 3.x 已于 2008 年发布,但至今仍被广泛使用。Python 2.x 的简单性和易用性是其主要特点之一....
阅读 3 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India