Número de subarreglos que tienen una suma en un rango dado

Dada una array arr[] de enteros positivos y un rango (L, R). Encuentre el número de subarreglos que tienen una suma en el rango L a R.
Ejemplos: 
 

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}.

Una solución simple es considerar uno por uno cada subarreglo y encontrar su suma. Si la suma se encuentra en el rango [L, R], incremente el conteo. La complejidad temporal de esta solución es O(n^2).
Una solución eficiente es encontrar primero el número de subarreglos que tienen una suma menor o igual que R. De este recuento, reste el número de subarreglos que tienen una suma menor o igual que L-1. Para encontrar el número de subarreglos que tienen una suma menor o igual que el valor dado, se usa el método de tiempo lineal usando la ventana deslizante que se analiza en la siguiente publicación: 
Número de subarreglos que tienen una suma menor o igual que k .
A continuación se muestra la implementación del enfoque anterior:
 

C++

// CPP program to find number of subarrays having
// sum in the range L to R.
#include <bits/stdc++.h>
using namespace std;
 
// Function to find number of subarrays having
// sum less than or equal to x.
int countSub(int arr[], int n, int x)
{
 
    // Starting index of sliding window.
    int st = 0;
 
    // Ending index of sliding window.
    int end = 0;
 
    // Sum of elements currently present
    // in sliding window.
    int sum = 0;
 
    // To store required number of subarrays.
    int cnt = 0;
 
    // Increment ending index of sliding
    // window one step at a time.
    while (end < n) {
 
        // Update sum of sliding window on
        // adding a new element.
        sum += arr[end];
 
        // Increment starting index of sliding
        // window until sum is greater than x.
        while (st <= end && sum > x) {
            sum -= arr[st];
            st++;
        }
 
        // Update count of number of subarrays.
        cnt += (end - st + 1);
        end++;
    }
 
    return cnt;
}
 
// Function to find number of subarrays having
// sum in the range L to R.
int findSubSumLtoR(int arr[], int n, int L, int R)
{
 
    // Number of subarrays having sum less
    // than or equal to R.
    int Rcnt = countSub(arr, n, R);
 
    // Number of subarrays having sum less
    // than or equal to L-1.
    int Lcnt = countSub(arr, n, L - 1);
 
    return Rcnt - Lcnt;
}
 
// Driver code.
int main()
{
    int arr[] = { 1, 4, 6 };
    int n = sizeof(arr) / sizeof(arr[0]);
 
    int L = 3;
    int R = 8;
 
    cout << findSubSumLtoR(arr, n, L, R);
    return 0;
}

Java

// Java program to find number
// of subarrays having sum in
// the range L to R.
import java.io.*;
 
class GFG
{
     
    // Function to find number
    // of subarrays having sum
    // less than or equal to x.
    static int countSub(int arr[],
                        int n, int x)
    {
     
        // Starting index of
        // sliding window.
        int st = 0;
     
        // Ending index of
        // sliding window.
        int end = 0;
     
        // Sum of elements currently
        // present in sliding window.
        int sum = 0;
     
        // To store required
        // number of subarrays.
        int cnt = 0;
     
        // Increment ending index
        // of sliding window one
        // step at a time.
        while (end < n)
        {
     
            // Update sum of sliding
            // window on adding a
            // new element.
            sum += arr[end];
     
            // Increment starting index
            // of sliding window until
            // sum is greater than x.
            while (st <= end && sum > x)
            {
                sum -= arr[st];
                st++;
            }
     
            // Update count of
            // number of subarrays.
            cnt += (end - st + 1);
            end++;
        }
     
        return cnt;
    }
     
    // Function to find number
    // of subarrays having sum
    // in the range L to R.
    static int findSubSumLtoR(int arr[], int n,
                              int L, int R)
    {
     
        // Number of subarrays
        // having sum less than
        // or equal to R.
        int Rcnt = countSub(arr, n, R);
     
        // Number of subarrays
        // having sum less than
        // or equal to L-1.
        int Lcnt = countSub(arr, n, L - 1);
     
        return Rcnt - Lcnt;
    }
     
    // Driver code
    public static void main (String[] args)
    {
        int arr[] = { 1, 4, 6 };
        int n = arr.length;
     
        int L = 3;
        int R = 8;
     
        System.out.println(findSubSumLtoR(arr, n, L, R));
    }
}
 
// This code is contributed
// by Mahadev99

C#

// C# program to find number
// of subarrays having sum in
// the range L to R.
using System;
 
class GFG
{
     
    // Function to find number
    // of subarrays having sum
    // less than or equal to x.
    static int countSub(int[] arr,
                        int n, int x)
    {
     
        // Starting index of
        // sliding window.
        int st = 0;
     
        // Ending index of
        // sliding window.
        int end = 0;
     
        // Sum of elements currently
        // present in sliding window.
        int sum = 0;
     
        // To store required
        // number of subarrays.
        int cnt = 0;
     
        // Increment ending index
        // of sliding window one
        // step at a time.
        while (end < n)
        {
     
            // Update sum of sliding
            // window on adding a
            // new element.
            sum += arr[end];
     
            // Increment starting index
            // of sliding window until
            // sum is greater than x.
            while (st <= end && sum > x)
            {
                sum -= arr[st];
                st++;
            }
     
            // Update count of
            // number of subarrays.
            cnt += (end - st + 1);
            end++;
        }
     
        return cnt;
    }
     
    // Function to find number
    // of subarrays having sum
    // in the range L to R.
    static int findSubSumLtoR(int[] arr, int n,
                              int L, int R)
    {
     
        // Number of subarrays
        // having sum less than
        // or equal to R.
        int Rcnt = countSub(arr, n, R);
     
        // Number of subarrays
        // having sum less than
        // or equal to L-1.
        int Lcnt = countSub(arr, n, L - 1);
     
        return Rcnt - Lcnt;
    }
     
    // Driver code
    public static void Main ()
    {
        int[] arr = { 1, 4, 6 };
        int n = arr.Length;
     
        int L = 3;
        int R = 8;
     
        Console.Write(findSubSumLtoR(arr, n, L, R));
    }
}
 
// This code is contributed
// by ChitraNayal

Python 3

# Python 3 program to find
# number of subarrays having
# sum in the range L to R.
 
# Function to find number
# of subarrays having sum
# less than or equal to x.
def countSub(arr, n, x):
     
    # Starting index of
    # sliding window.
    st = 0
 
    # Ending index of
    # sliding window.
    end = 0
 
    # Sum of elements currently
    # present in sliding window.
    sum = 0
 
    # To store required
    # number of subarrays.
    cnt = 0
 
    # Increment ending index
    # of sliding window one
    # step at a time.
    while end < n :
         
        # Update sum of sliding
        # window on adding a
        # new element.
        sum += arr[end]
 
        # Increment starting index
        # of sliding window until
        # sum is greater than x.
        while (st <= end and sum > x) :
            sum -= arr[st]
            st += 1
 
        # Update count of
        # number of subarrays.
        cnt += (end - st + 1)
        end += 1
 
    return cnt
 
# Function to find number
# of subarrays having sum
# in the range L to R.
def findSubSumLtoR(arr, n, L, R):
     
    # Number of subarrays
    # having sum less
    # than or equal to R.
    Rcnt = countSub(arr, n, R)
 
    # Number of subarrays
    # having sum less than
    # or equal to L-1.
    Lcnt = countSub(arr, n, L - 1)
 
    return Rcnt - Lcnt
 
# Driver code
arr = [ 1, 4, 6 ]
n = len(arr)
L = 3
R = 8
print(findSubSumLtoR(arr, n, L, R))
 
# This code is contributed
# by ChitraNayal

PHP

<?php
// PHP program to find number
// of subarrays having sum
// in the range L to R.
 
// Function to find number
// of subarrays having sum
// less than or equal to x.
function countSub(&$arr, $n, $x)
{
    // Starting index of
    // sliding window.
    $st = 0;
 
    // Ending index of
    // sliding window.
    $end = 0;
 
    // Sum of elements currently
    // present in sliding window.
    $sum = 0;
 
    // To store required
    // number of subarrays.
    $cnt = 0;
 
    // Increment ending index
    // of sliding window one
    // step at a time.
    while ($end < $n)
    {
        // Update sum of sliding window
        // on adding a new element.
        $sum += $arr[$end];
 
        // Increment starting index
        // of sliding window until
        // sum is greater than x.
        while ($st <= $end && $sum > $x)
        {
            $sum -= $arr[$st];
            $st++;
        }
 
        // Update count of
        // number of subarrays.
        $cnt += ($end - $st + 1);
        $end++;
    }
 
    return $cnt;
}
 
// Function to find number
// of subarrays having sum
// in the range L to R.
function findSubSumLtoR(&$arr, $n, $L, $R)
{
    // Number of subarrays
    // having sum less
    // than or equal to R.
    $Rcnt = countSub($arr, $n, $R);
 
    // Number of subarrays
    // having sum less
    // than or equal to L-1.
    $Lcnt = countSub($arr, $n, $L - 1);
 
    return $Rcnt - $Lcnt;
}
 
// Driver code.
$arr = array( 1, 4, 6 );
$n = sizeof($arr);
$L = 3;
$R = 8;
echo findSubSumLtoR($arr, $n, $L, $R);
 
// This code is contributed
// by ChitraNayal
?>

Javascript

<script>
 
// Javascript program to find number of subarrays having
// sum in the range L to R.
 
// Function to find number of subarrays having
// sum less than or equal to x.
function countSub(arr, n, x)
{
 
    // Starting index of sliding window.
    var st = 0;
 
    // Ending index of sliding window.
    var end = 0;
 
    // Sum of elements currently present
    // in sliding window.
    var sum = 0;
 
    // To store required number of subarrays.
    var cnt = 0;
 
    // Increment ending index of sliding
    // window one step at a time.
    while (end < n) {
 
        // Update sum of sliding window on
        // adding a new element.
        sum += arr[end];
 
        // Increment starting index of sliding
        // window until sum is greater than x.
        while (st <= end && sum > x) {
            sum -= arr[st];
            st++;
        }
 
        // Update count of number of subarrays.
        cnt += (end - st + 1);
        end++;
    }
 
    return cnt;
}
 
// Function to find number of subarrays having
// sum in the range L to R.
function findSubSumLtoR(arr, n, L, R)
{
 
    // Number of subarrays having sum less
    // than or equal to R.
    var Rcnt = countSub(arr, n, R);
 
    // Number of subarrays having sum less
    // than or equal to L-1.
    var Lcnt = countSub(arr, n, L - 1);
 
    return Rcnt - Lcnt;
}
 
// Driver code.
var arr = [ 1, 4, 6 ];
var n = arr.length;
var L = 3;
var R = 8;
document.write( findSubSumLtoR(arr, n, L, R));
 
</script>

Producción: 
 

 3

Complejidad temporal: O(n) 
Espacio auxiliar: O(1)
 

Publicación traducida automáticamente

Artículo escrito por nik1996 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *