在 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 是数组的大小)。

有效的方法

为了节省时间,我们使用另一种被称为高效approach.Now的方法是使用滑动窗口技术,使用这种技术我们将更快或更有效地计算我们的结果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 n; // 数组大小

    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)); // 最终答案。

    cout << answer << "\n";

    return 0;

}

输出结果
1

以上代码说明

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

子计数功能

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

首先,我们从“结束和开始”开始,它们的值都是 0。当我们遍历数组时,我们维护从开始到结束的元素的总和。之后,如果我们的开始等于结束并且总和大于或等于 x,我们开始移动我们的起点并继续减少我们的总和,因为我们从总和中去除元素。

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

结论

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

以上是 在 C++ 中查找给定范围内具有总和的子数组的数量 的全部内容, 来源链接: utcz.com/z/317262.html

回到顶部