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

找出长度< = k且总和== s的子阵列数

杜炫明
2023-03-14

我遇到了以下问题:

给定一个整数数组arr,一个正整数k和一个整数s,您的任务是查找长度不大于k且和等于s的非空连续子阵列的数量。

对于< code>arr = [1,2,4,-1,6,1],< code>k = 3,以及< code>s = 6,输出应为< code >解(arr,k,s) = 3。

  • 长度1和等于s=6的连续子数组之间存在1子数组,它是[6]
  • 长度2和等于s=6的连续子数组之间存在1子数组,它是[2,4]
  • 长度3和等于s=6的连续子数组之间存在1子数组,它是[-1,6,1]

请注意,子数组 [1, 2, 4, -1] 的总和也为 s,但其长度大于 k,因此不适用。

所以答案是3

下面是我在Python中的尝试。我的想法是将每个前缀和出现的索引存储在字典中。例如,如果前缀和6出现在索引13,则字典中的条目将是六:[1,3]。然后,在每个步骤中,我们可以检查是否遇到了目标和<code>s</code>以及子阵列的范围。

这通过了10/15的测试案例,但是超出了剩余隐藏案例的时间限制。如果有人有优化的算法,我会很感激。

import collections
def solution(arr, k, s):
    res = 0
    curr = 0
    d = collections.defaultdict(list)
    d[0].append(-1)
    for i, num in enumerate(arr):
        curr += num
        if curr - s in d:
            for idx in d[curr-s]:
                if i - idx <= k:
                    res += 1
        d[curr].append(i)
    return res

共有1个答案

南门意蕴
2023-03-14

我们使用计数字典来跟踪前缀和的计数。我们还将使用大小为k的滑动窗口,根据前面的索引增加前缀和的计数,并根据后面的索引递减它。在我们递减之前,我们将根据累积和的计数添加到有效子数组的计数中,该计数比我们的后面累积和多k。

  def solution(arr, k, s)
    num_subarrays = 0
    front_cumulative_sum = 0
    rear_cumulative_sum = 0
    cumulative_sum_to_count = Hash.new { |h, cumsum| h[cumsum] = 0 }
    0.upto(arr.size - 1 + k) do |front_index|
      front_cumulative_sum += arr[front_index] if front_index <= arr.size - 1
      cumulative_sum_to_count[front_cumulative_sum] += 1 if front_index <= arr.size - 1
      if front_index >= k
        rear_index = front_index - k
        rear_cumulative_sum += arr[rear_index]
        num_subarrays += cumulative_sum_to_count[s + rear_cumulative_sum]
        cumulative_sum_to_count[rear_cumulative_sum] -= 1
      end
    end
    return num_subarrays
  end


> arr = [1,2,4,-1,6,1]
> k=3
> s=6
> solution(arr, k, s)
=> 3
 类似资料:
  • 给定一个整数数组,包含不超过两个不同值的最长子数组的长度是多少,使得非重复值的差异不超过 1? 例: 最大的子数组长度为4:[1,2,1,2]。 最大的子阵列具有长度4:[3,3,2,2]。值1和3相差1以上,因此[1,1,1,3,3]无效。

  • 我知道一个O(n2)soln,它能以更好的方式实现吗,因为数组中元素的数量限制非常大

  • 给出了一个长度为n的数组。求子数组元素的乘积之和。 解释 长度为3的数组A=[2,3,4]。 因为,对于以模1000000007计算的较长的子数组,乘积可以更大。 对于所有可能长度的子数组,即1,2,3,....,n,求这些和的有效方法是什么,其中n是数组的长度。

  • 有人能为下面的问题提出一个简单的解决方案吗? 最长子数组:查找子数组中元素之和小于或等于“k”的最长连续子数组的长度。 输入为:< code>array和< code>k。 例子: 输出: 2个 解释: 子数组:{1},{2},}3},1,2},2,3},{1,2,3} {1,2} =

  • 文件输入。txt由两行组成:第一行是整数N空格,然后是整数K(1 ≤ N、 K级≤ 250000). Second有N个空间除数的整数,其中每个整数都小于或等于K。保证从1到K的每个整数都在数组中。任务是找到包含所有整数的最小长度的子数组。并打印其开始和结束。请注意,索引从1开始。 示例: 我在最近的一次编程比赛中完成了这个任务。一切都结束了,我没有作弊。我已经使用python 3实现了它: 这个

  • 给定一个大小为n的非递减数组a和一个整数k,如何找到数组a的一个子序列S,其元素的最大可能和,使得这个和最多为k。如果有多个这样的子序列,我们只想找到一个。 例如,让数组为{1,2,2,4},n=4,k=7。那么,答案应该是{1,2,4}。 蛮力方法大约需要O(n(2^n-1))但是有更有效的解决方案吗?