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

c++server side programmingprogramming

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

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

输出:3

子数组为 {1, 4}, {4}, {6}。

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

输出:6

子数组为 {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){ // 在此循环中我们将移动右边界
        sum = sum + arr[end];
        while(start <= end && sum >= x){ // 此循环将移动左边界
            sum = sum - arr[start]; // 在移动左边界的同时我们将减少 sum。
                                     // 用于排除前面的元素。
            start++;              // 并移动左边界。
        }
        count = count + ((end - start) + 1); // 计算子数组。
        end++;
    }
    return count;
}
int main(){
    int arr[] = { 1, 4, 6 };
    int n = sizeof(arr) / sizeof(arr[0]);
    int L = 3;
    int R = 8;
    int answer;
    answer = subCount(arr, n, R)  - subCount(arr, n, (L - 1)); // 最终答案。
    cout << answer << "\n";
    return 0;
}

输出

3

上述代码的解释

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

Subcount 函数

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

首先,我们从 'end 和 start' 开始,它们的值都是 0。在遍历数组时,我们保持从开始到结束元素的总和。之后,如果我们的开始等于结束,并且总和大于或等于 x,我们开始移动开始,并在从总和中减去元素的同时不断减少总和。

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

结论

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


相关文章