当前位置: 首页 > 知识库问答 >
问题:

如何找到和k的最大子数组

卫华奥
2023-03-14

假设您给出了一个大小为N的数组,它可以有正数和负数。我们需要返回总和的最大子数组的长度等于k。我尝试使用滑动窗口算法,但很快我发现它在这里不起作用,因为数组元素可以有正负整数。

例如:

arr=[-20,-38,-4,-7,10,4]和k = 3很明显,有两个可能的子阵列([-4,-7,10,4]和[-7,10]),它们的和等于给定的k。因此输出将是4(最大子阵列的长度)

蛮力方法将采取O(n^2)有没有更好的方法来做同样的问题?

共有2个答案

皇甫文乐
2023-03-14

您可以在geekforgeeks中找到有关问题的更多信息,“总和为k的最长子数组”。

朴素方法:考虑所有子数组的总和,并返回总和为“k”的最长子数组的长度。

时间复杂度为O(n^2)。

有效的方法是(使用哈希表):

  • 初始化sum=0和maxLen=0。
  • 创建一个包含(sum, index)元组的哈希表。
  • 对于i=0到n-1,执行以下步骤:
    • 将arr[i]累加到总和
    • 如果sum==k,更新maxLen=i 1。
    • 检查sum是否存在于哈希表中。如果不存在,则将其作为(sum, i)对添加到哈希表中。
    • 检查(sum-k)是否存在于哈希表中。如果存在,则从哈希表中获取(sum-k)的索引作为索引。现在检查maxLen是否

    时间复杂度:O(N),其中N是给定数组的长度。

    辅助空间:O(N),用于在HashMap中存储maxLlong。

    另一种方法

    这种方法不适用于负数。该方法是使用可变大小滑动窗口的概念,使用2个指针初始化I、j和sum = k。如果总和小于k,只增加j,如果总和等于k,计算最大值,如果总和大于k,当总和小于k时,减去第I个元素。

    时间复杂度:O(N),其中N是给定数组的长度。

    辅助空间:O(1)。

仲孙温文
2023-03-14

制作哈希表。

遍历数组,计算累积总和(从第0项到第i项),并将结果放入哈希表中,当前总和作为键,对于值-将索引插入到第一个和最后出现的对中,如下所示:{13:[2,19]}sum 13首先在索引2处满足,并且该总和的最右边位置是19。

然后再次扫描阵列。对于总和为 S 的索引 i,查找键 S k 的哈希表,然后选择最远的索引。例如,有索引5,总和6,k= 7,我们可以在上面的例子中找到最远的索引19。

 类似资料:
  • 子数组包含正数和负数。你必须找到一个最大和子数组,使子数组的长度大于或等于k。 下面是我用C++编写的使用Kadane算法的代码。 我的代码工作得很好,但很慢,我想不出任何方法来改进我的代码。我也读过这个问题,找到最长的子数组,它的和可以被K整除,但这不是我想要的,长度也可以大于K。

  • 我需要找到总和大于或等于< code>k的最小子阵列长度。数组将只有正数。 例如 输入:< code>target = 7,< code>nums = [2,3,1,2,4,3]输出:2说明:子数组[4,3]在问题约束下长度最小。 在我的代码中,对于输入:< code>target = 7,< code>nums = [2,3,1,2,4,3]我得到的答案是< code>3,但正确答案是< cod

  • 我知道这是一个背包问题,其中权重和值相等,但我认为我在编码逻辑上犯了一个错误,因为即使对于数组中元素的数量(N)为50并且所需的最大总和(M)4500。 为了澄清这个问题,我们得到了一个由N个正整数和一个正整数M组成的数组。数组元素只能使用一次。我们必须找到这个数组的子集(不一定是连续的),使得总和最接近M,但不超过它。 这是我使用动态编程的尝试: 那么在我的代码中是否有任何可能的优化可以帮助我降

  • 本文向大家介绍寻找一数组中前K个最大的数相关面试题,主要包含被问及寻找一数组中前K个最大的数时的应答技巧和注意事项,需要的朋友参考一下 考察点:数组    

  • 给定一个非负整数数组,设计最简单的算法来找到最大大小的子数组,并将其加到最小的值。 我的想法是,因为它们是非负整数,所以和最小的数组总是单个单元数组,只有原始数组的最小值。如果我理解正确的话,它取决于什么具有更高的优先级,具有更高的长度或更小的值。然而,这个问题从来没有明确说明哪一个优先。 我在这个问题上是正确的,还是我遗漏了什么?