和为给定值的子数组2025年3月17日 | 阅读20分钟
让我们通过一个例子来理解它—— 我们给出了一个数组和一个和。 示例 1给定 arr = { 10 , 12 , 2 , 4 , 13 , 19 , 5 } sum = 18 输出 给定的和在索引 1 到 3 之间找到 子数组是:{ 12 , 2 , 4 } 对应元素索引之间的所需和是:12 + 2 + 4 = 18 示例 2给定 arr = { 1 , 12 , 2 , 14 , 3 , 16 , 4 } sum = 19 输出 给定的和在索引 4 到 5 之间找到 子数组是:{ 3, 16 } 对应元素索引之间的所需和是:3 + 16 = 19 示例 3给定 arr = { 1 , 12 , 2 , 14 , 3 , 16 , 4 } sum = 5 输出 在给定的数组中未找到给定的和 示例 4给定 arr = { 1 , 13 , 2 , 14 , 3 , 7 , 4 } sum = 14 输出 给定的和在索引 0 到 1 之间找到 子数组是:{ 1, 13 } 对应元素索引之间的所需和是:1 + 13 = 14 这里如果我们观察到,有不止一个子数组,其中所有元素的总和等于 14,即如下所示——
如果我们得到多个这样的子数组,通过相加它们的元素得到期望的和,那么输出会是什么?它将显示**第一个最短的子数组**,其元素的总和恰好等于给定的和。我们基于以上逻辑推导算法,简而言之,我们查找与相应的给定和首次匹配的子数组。 用于从给定数组中查找子数组,其元素总和与给定和匹配的方法——
让我们使用上述方法从给定数组中找到匹配给定和的子数组。 方法 # 1 暴力方法,一种低效且简单的方法——程序员必须始终首选的方法是暴力方法,这将增加我们对问题的理解。一旦我们用这种方法解决了这个问题,它将提高我们的信心水平,之后我们可以进一步尝试其他方法,这些方法可能比此方法更有效。 让我们用这种方法来讨论上述问题 正如我们已经看到的,对于这个问题的工作,我们都需要找到一个子数组,其中所有元素的总和与给定的和值匹配。 用于解决此问题的暴力方法实现算法—— 步骤 1 - 从用户那里获取一个包含 ' n ' 个元素的数组;在主函数中,这些元素是指非负整数。我们也可以从用户那里获取和值,以便相应地生成结果。 步骤 2 - 调用一个函数来查找一个子数组,其中所有元素的总和与给定的和匹配。将原始数组、元素数量和给定的和值作为参数传递给函数。 步骤 3 - 在子数组函数中,运行两个循环;一个循环将从数组的第 0 个索引运行到最后一个索引。我们可以定义 i = 0 到 i = n-1 来遍历从索引 0 到最后一个索引的数组。 步骤 4 - 另一个循环在第一个循环内部,正如我们所说,它是嵌套循环,它将从 j = i + 1 运行到 n。 步骤 5 - 在这个子数组函数的开始,声明一个名为 currentsum 的变量;它最初将用 arr [ 0 ] 初始化。 步骤 6 - 在第二个循环中,推导一个条件来检查当前总和是否等于给定的总和;如果相等,则以索引的形式打印结果。 步骤 7 - 如果不相等,则检查 currentsum 是否大于 j == n 的总和;如果此条件为真,则从循环中中断。 步骤 8 - 最后,将 currentsum = currentsum + arr [ j ] 赋值。 步骤 9 - 如果 currentsum == sum 条件失败,步骤 8 将通过将 arr [ j ] 的值加到 currentsum 来计算当前总和。 步骤 10 - 在执行完循环 1 和嵌套在循环 1 中的循环 2 后,我们将得到期望的结果。 步骤 11 - 如果仍然出现 currentsum 与给定的和不匹配的情况,则表示主数组中不存在这样的子数组。 步骤 12 - 最后,我们将在屏幕上看到期望的输出。 使用方法 # 1 在 C 编程语言中实现带给定和的子数组问题 使用方法 # 1 解决带给定和的子数组问题的以下 C 程序输出 ![]() 使用方法 # 1 在 C++ 编程语言中实现带给定和的子数组问题 使用方法 # 1 解决带给定和的子数组问题的以下 C++ 程序输出 ![]() 使用方法 # 1 在 Python 编程语言中实现带给定和的子数组问题 使用方法 # 1 解决带给定和的子数组问题的以下 Python 程序输出 ![]() 使用方法 # 1 在 Java 编程语言中实现带给定和的子数组问题 使用方法 # 1 解决带给定和的子数组问题的以下 Java 程序输出 ![]() 使用方法 # 1 在 C# 编程语言中实现带给定和的子数组问题 使用方法 # 1 解决带给定和的子数组问题的以下 C# 程序输出 ![]() 在特定编程语言中成功执行程序并遵循**双重遍历方法**的暴力算法后,我们将获得正确的结果,即找到结果子数组,其元素总和恰好等于给定的和值。 现在让我们分析我们正在应用的算法的运行时间和性能,以通过查找方法 # 1 中使用的算法的时间复杂度和空间复杂度来按升序查找数组。 方法 # 1 的时间复杂度—— 为了找到时间复杂度,我们需要观察算法并分析特定行执行所花费的时间。我们可以看到,我们需要使用两个 for 循环遍历数组并检查查找和的条件。因此,时间复杂度将是—— T ( n ) = O ( n ).O ( n ) T ( n ) = O ( n2 ) 因此,时间复杂度将是 O ( n2 ),因为我们对需要 ' n2 ' 时间来解决 ' n ' 个元素的问题进行了渐近的粗略估计。 方法 # 1 的空间复杂度—— 为了找出空间复杂度,我们需要观察程序并分析存储所有变量所需的空间;当我们注意到程序时,我们将观察到不需要额外的空间来存储元素。 S ( n ) = O ( 1 ) 因此,上述方法 # 1 的空间复杂度将是常数。 方法 # 2 线性复杂度方法,一种低效且简单的方法——正如我们已经看到方法 1(即暴力方法)的工作,我们将进一步研究一种更有效的方法;它非常容易实现来解决任何问题;顾名思义,线性复杂度方法具有线性复杂度。一旦你成功地创建了程序,就尝试找到其他最佳替代方法来以更有效的方式解决给定的问题,其性能优于此方法,时间复杂度低于此方法。 让我们用这种方法来讨论上述问题 正如我们已经看到的,对于这个问题的工作,我们都需要找到一个子数组,其中所有元素的总和与给定的和值匹配。 用于解决此问题的线性复杂度方法实现算法——步骤 1 - 从用户那里获取一个包含 ' n ' 个元素的数组;在主函数中,这些元素是指非负整数。还要从用户那里获取和值,以便我们可以相应地生成结果。 步骤 2 - 调用一个函数来查找一个子数组,其中所有元素的总和与给定的和匹配。将原始数组、元素数量和给定的和值作为参数传递给函数。 步骤 3 - 在子数组函数中,只运行一个循环;它将从数组的第 0 个索引运行到最后一个索引。我们可以定义 i = 0 到 i = n-1 来遍历从索引 0 到最后一个索引的数组。还将一个名为 ' begin ' 的变量设置为 0。 步骤 4 - 在这个子数组函数的开始,声明一个名为 currentsum 的变量;这个变量最初将用 arr [ 0 ] 初始化。 步骤 5 - 在该循环内,我们将运行一个 while 循环来检查 currentsum 是否大于给定和且 begin 小于 i - 1 的条件;如果此条件为真,那么我们将更新 current sum 变量为 current sum - arr [ begin ],然后递增 begin,即 begin = begin + 1。 步骤 6 - 之后,在 while 循环之外,使用 if 语句检查 currentsum 是否等于 sum。 步骤 7 - 如果为真,则将结果打印为 begin 和 i - 1 之间的和。 步骤 8 - 之后,使用 if 语句再检查一个语句,看 i 是否小于 n。 步骤 9 - 如果证明为真,则用 currentsum + arr [ i ] 更新 currentsum。 步骤 10 - 如果仍然出现 currentsum 与给定的和不匹配的情况,则表示主数组中不存在这样的子数组。 步骤 11 - 最后,我们将在屏幕上看到期望的输出。 使用方法 # 2 在 C 编程语言中实现带给定和的子数组问题 使用方法 # 2 解决带给定和的子数组问题的以下 C 程序输出 ![]() 使用方法 # 2 在 C++ 编程语言中实现带给定和的子数组问题 使用方法 # 2 解决带给定和的子数组问题的以下 C++ 程序输出 ![]() 使用方法 # 2 在 Java 编程语言中实现带给定和的子数组问题 使用方法 # 2 解决带给定和的子数组问题的以下 Java 程序输出 ![]() 使用方法 # 2 在 Python 编程语言中实现带给定和的子数组问题 使用方法 # 2 解决带给定和的子数组问题的以下 Python 程序输出 ![]() 使用方法 # 2 在 C# 编程语言中实现带给定和的子数组问题 使用方法 # 2 解决带给定和的子数组问题的以下 C# 程序输出 ![]() 现在让我们分析我们正在应用的算法的性能和运行时间,以通过查找方法 # 2 中使用的算法的时间复杂度和空间复杂度来找到一个子数组,其中其元素的总和等于给定的和值。 方法 # 2 的时间复杂度—— 为了找到时间复杂度,首先,我们需要观察算法并分析一行代码执行所花费的时间。我们可以看到,数组的遍历是通过只使用一个 for 循环和检查查找和的条件来完成的。因此,时间复杂度将是—— T ( n ) = O ( n ) + C ' C ' 是任何常数 T ( n ) = O ( n ) 因此,时间复杂度将是 O ( n ),因为我们进行渐近的粗略估计,即我们需要 ' n ' 时间来解决 ' n ' 个元素的问题。 方法 # 2 的空间复杂度—— 为了找到空间复杂度,我们需要观察代码行并分析存储所有变量所需的空间,正如我们注意到的程序一样,不需要额外的空间来存储元素。 S ( n ) = O ( 1 ) 因此,上述方法 # 2 的空间复杂度将是常数。 下一个主题自组织列表 |
我们请求您订阅我们的新闻通讯以获取最新更新。