Maison > développement back-end > C++ > le corps du texte

Écrivez un programme en C++ pour trouver le nombre de sous-tableaux avec une somme dans une plage donnée

WBOY
Libérer: 2023-09-01 14:37:11
avant
579 Les gens l'ont consulté

Écrivez un programme en C++ pour trouver le nombre de sous-tableaux avec une somme dans une plage donnée

在本文中,我们将使用 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}.
Copier après la connexion

寻找解决方案的方法

我们将解释使用 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 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)); // Final Answer.
    cout << answer << "\n";
    return 0;
}
Copier après la connexion

输出

3
Copier après la connexion

上述代码说明

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

Subcount 函数

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

首先,我们从“结束”和“开始”开始,其值均为 0。当我们遍历数组时,我们维护从头到尾的元素之和。之后,如果我们的开始等于结束并且总和大于或等于 x,我们开始移动开始并在从总和中取出元素时不断减少总和。

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

结论

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:tutorialspoint.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal