使用 C++ 查找给定范围内的子数组数量


在本文中,我们将使用 C++ 程序解决在给定范围内求和的子数组数量的问题。我们有一个正整数数组 arr[],以及一个范围 {L, R},我们需要计算在给定范围 L 到 R 内求和的所有子数组的总数。以下是一个简单的示例问题:

Input : arr[] = {1, 4, 6}, L = 3, R = 8

Output : 3

The subarrays are {1, 4}, {4}, {6}.


Input : arr[] = {2, 3, 5, 8}, L = 4, R = 13

Output : 6

The subarrays are {2, 3}, {2, 3, 5}, {3, 5},
{5}, {5, 8}, {8}.

查找解决方案的方法

我们将解释两种使用 C++ 解决此问题的方法:

暴力方法

最基本的暴力方法用于计算每个子数组的和,然后查找该和是否存在于给定范围内。(但是这种方法会花费我们大量时间,因为它的时间复杂度为 O(n*n),其中 n 是数组的大小)。

高效方法

为了节省时间,我们使用另一种称为高效方法的方法。现在,高效方法使用滑动窗口技术,使用这种技术,我们将以 O(n) 的效率更快或更有效地计算结果。

示例

#include <bits/stdc++.h>
using namespace std;
int subCount(int *arr, int n, int x){
    int start = 0, end = 0, sum = 0, count = 0;
    while (end < n){ // we will be moving right border in this loop
        sum = sum + arr[end];
        while(start <= end && sum >= x){ // this loop will move our left border
            sum = sum - arr[start]; // we will decrement sum while moving left border.
                                   // For excluding the previous elements.
            start++;                // and move the left border.
        }
        count = count + ((end - start) + 1); // counting the subarrays.
        end++;
    }
    return count;
}
int main(){
    int n; // size of array
    int L, R;
    cin >> n;
    int arr[n];
    for(int i = 0; i < n; i++)
       cin >> arr[i];
    cin >> L >> R;
    int answer;
    answer = subCount(arr, n, R)  - subCount(arr, n, (L - 1)); // Final Answer.
    cout << answer << "\n";
    return 0;
}

输出

1

以上代码的解释

在这种方法中,我们计算和小于给定范围上限的子数组的数量,然后使用我们的 subcount 函数减去和小于给定范围下限的子数组的数量。

Subcount 函数

此函数使用滑动窗口技术查找计数小于 x 的子数组的计数。

首先,我们将“end 和 start”都设置为 0 作为其值。当我们遍历数组时,我们保持从开始到结束的元素的总和。之后,如果我们的 start 等于我们的 end 且总和大于或等于 x,我们开始移动我们的 start 并随着我们从总和中移除元素而减少我们的总和。

直到我们的总和变小于 x 或我们的 start 变大于 end。现在,我们通过子数组计数增加计数,然后将右边界增加 1。现在,在我们的外部循环结束后,我们返回子数组的总计数。

结论

在本文中,我们解决了一个问题,即使用滑动窗口技术以 O(n) 的时间复杂度查找给定范围内的子数组数量。我们还从解决此问题的 C++ 程序以及我们可以轻松解决此问题的完整方法(普通方法和高效方法)中学到了知识。我们可以在其他语言(如 C、Java、Python 等)中编写相同的程序。

更新于:2021-11-24

853 次浏览

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告