Recuento de subarreglos que tienen una suma igual a su longitud | conjunto 2

Dado un arreglo arr[] de tamaño N , la tarea es encontrar el número de subarreglos que tienen una suma de sus elementos igual al número de elementos en él.

Ejemplos:

Entrada : N = 3, arr[] = {1, 0, 2}
Salida: 3
Explicación:
el número total de subarreglos es 6, es decir, {1}, {0}, {2}, {1, 0}, {0 , 2}, {1, 0, 2}.
De los 6 subarreglos, los tres siguientes satisfacen las condiciones dadas: 

  • {1}: Suma = 1, Longitud = 1
  • {0, 2}: Suma = 2, Longitud = 2
  • {1, 0, 2}: Suma = 3, Longitud = 3

Entrada: N = 3, arr[] = {1, 1, 0}
Salida: 3
Explicación:
El número total de subarreglos es 6, es decir, {1}, {1}, {0}, {1, 1}, {1 , 0}, {1, 1, 0}.
De los 6 subarreglos, los tres siguientes satisfacen las condiciones dadas: 

  • {1}: Suma = 1, Longitud = 1
  • {1, 1}: Suma = 2, Longitud = 2
  • {1}: Suma = 1, Longitud = 1

Entrada: N = 6, arr[] = {1, 1, 1} Salida: 3 Explicación: el número total de subarreglos es 6, es decir, {1}, {1}, {1}, {1, 1}, {1, 1}, {1, 1, 1}. De los 6 subarreglos, los siguientes seis subarreglos satisfacen las condiciones dadas:

  • {1},{1},{1}: Suma=1, Longitud=1, Número de subarreglos=3
  • {1,1},{1,1}: Suma=2, Longitud=2, Número de subarreglos=2
  • {1,1,1}: Suma=3, Longitud=3, Número de subarreglos=1

Número total de subarreglos que tienen Suma igual a su Longitud = 6

      

Enfoque ingenuo y basado en la suma de prefijos : consulte la publicación anterior para conocer los enfoques más simples y basados ​​​​en la suma de prefijos para resolver el problema. 

Tiempo Complejidad: O(N 2 )
Espacio Auxiliar: O(N)

Enfoque eficiente: para optimizar el enfoque anterior, la idea es almacenar las ocurrencias anteriores de subarreglos con las condiciones dadas y hacer uso de unordered_map para una búsqueda constante. A continuación se muestran los pasos:

  • Inicialice un mapa unordered_map M , responda para almacenar el recuento de subarreglos y sum para almacenar el prefijo sum del arreglo .
  • Recorre la array dada y haz lo siguiente:
    • Agregue el elemento actual a la suma .
    • Si M[sum – i] existe, agregue este valor a la respuesta ya que existe un subarreglo de longitud i cuya suma del elemento es la suma actual .
    • Incrementa la frecuencia de (suma – i) en el mapa M .
  • Después de los pasos anteriores, imprima el valor de la respuesta como el recuento total de subarreglos.

A continuación se muestra la implementación del enfoque anterior:

C++

// C++ program for the above approach
 
#include <bits/stdc++.h>
using namespace std;
 
// Function that counts the subarrays
// with sum of its elements as its length
int countOfSubarray(int arr[], int N)
{
    // Store count of elements upto
    // current element with length i
    unordered_map<int, int> mp;
 
    // Stores the final count of subarray
    int answer = 0;
 
    // Stores the prefix sum
    int sum = 0;
 
    // If size of subarray is 1
    mp[1]++;
 
    // Iterate the array
    for (int i = 0; i < N; i++) {
 
        // Find the sum
        sum += arr[i];
        answer += mp[sum - i];
 
        // Update frequency in map
        mp[sum - i]++;
    }
 
    // Print the total count
    cout << answer;
}
 
// Driver Code
int main()
{
    // Given array arr[]
    int arr[] = { 1, 0, 2, 1, 2, -2, 2, 4 };
 
    // Size of array
    int N = sizeof arr / sizeof arr[0];
 
    // Function Call
    countOfSubarray(arr, N);
 
    return 0;
}

Java

// Java program for the above approach
import java.util.*;
 
class GFG{
     
// Function that counts the subarrays
// with sum of its elements as its length
static void countOfSubarray(int arr[], int N)
{
     
    // Store count of elements upto
    // current element with length i
    Map<Integer,
        Integer> mp = new HashMap<Integer,
                                  Integer>(); 
 
    // Stores the final count of subarray
    int answer = 0;
 
    // Stores the prefix sum
    int sum = 0;
 
    // If size of subarray is 1
    if (mp.get(1) != null)
        mp.put(1, mp.get(1) + 1);
    else
        mp.put(1, 1);
 
    // Iterate the array
    for(int i = 0; i < N; i++)
    {
         
        // Find the sum
        sum += arr[i];
         
        if (mp.get(sum - i) != null)
            answer += mp.get(sum - i);
 
        // Update frequency in map
        if (mp.get(sum - i) != null)
            mp.put(sum - i, mp.get(sum - i) + 1);
        else
            mp.put(sum - i, 1);
    }
 
    // Print the total count
    System.out.print(answer);
}
 
// Driver Code
public static void main(String args[])
{
     
    // Given array arr[]
    int arr[] = { 1, 0, 2, 1, 2, -2, 2, 4 };
 
    // Size of array
    int N = arr.length;
 
    // Function Call
    countOfSubarray(arr, N);
}
}
 
// This code is contributed by ipg2016107

Python3

# Python3 program for the above approach
from collections import defaultdict
 
# Function that counts the subarrays
# with sum of its elements as its length
def countOfSubarray(arr, N):
 
    # Store count of elements upto
    # current element with length i
    mp = defaultdict(lambda : 0)
 
    # Stores the final count of subarray
    answer = 0
 
    # Stores the prefix sum
    sum = 0
 
    # If size of subarray is 1
    mp[1] += 1
 
    # Iterate the array
    for i in range(N):
 
        # Find the sum
        sum += arr[i]
        answer += mp[sum - i]
 
        # Update frequency in map
        mp[sum - i] += 1
 
    # Print the total count
    print(answer)
 
# Driver code
if __name__ == '__main__':
 
    # Given array
    arr = [ 1, 0, 2, 1, 2, -2, 2, 4 ]
 
    # Size of the array
    N = len(arr)
 
    # Function Call
    countOfSubarray(arr, N)
 
# This code is contributed by Shivam Singh

C#

// C# program for the
// above approach
using System;
using System.Collections.Generic;
class GFG{
     
// Function that counts
// the subarrays with sum
// of its elements as its length
static void countOfSubarray(int []arr,
                            int N)
{   
  // Store count of elements upto
  // current element with length i
  Dictionary<int,
             int> mp = new Dictionary<int,
                                      int>(); 
 
  // Stores the readonly
  // count of subarray
  int answer = 0;
 
  // Stores the prefix sum
  int sum = 0;
 
  // If size of subarray is 1
  mp[1] = 1;
 
  // Iterate the array
  for(int i = 0; i < N; i++)
  {
    // Find the sum
    sum += arr[i];
 
    if (mp.ContainsKey(sum - i))
      answer += mp[sum - i];
 
    // Update frequency in map
    if(mp.ContainsKey(sum - 1))
      mp[sum - 1]++;
    else
      mp[sum - 1] = 1;
  }
 
  // Print the total count
  Console.Write(answer - 2);
}
 
// Driver Code
public static void Main(String []args)
{
  // Given array []arr
  int []arr = {1, 0, 2, 1,
               2, -2, 2, 4};
 
  // Size of array
  int N = arr.Length;
 
  // Function Call
  countOfSubarray(arr, N);
}
}
 
// This code is contributed by gauravrajput1

Javascript

<script>
 
// JavaScript program for the above approach
 
// Function that counts the subarrays
// with sum of its elements as its length
function countOfSubarray(arr, N)
{
    // Store count of elements upto
    // current element with length i
    var mp = new Map();
 
    // Stores the final count of subarray
    var answer = 0;
 
    // Stores the prefix sum
    var sum = 0;
 
    // If size of subarray is 1
    if(!mp.has(1))
        mp.set(1, 1)
    else
        mp.set(1, mp.get(1)+1)
 
    // Iterate the array
    for (var i = 0; i < N; i++) {
 
        // Find the sum
        sum += arr[i];
        answer += mp.has(sum - i)?mp.get(sum - i):0;
 
        // Update frequency in map
        if(mp.has(sum - i))
            mp.set(sum - i, mp.get(sum - i)+1)
        else
            mp.set(sum - i, 1)
    }
 
    // Print the total count
    document.write( answer);
}
 
// Driver Code
 
// Given array arr[]
var arr = [1, 0, 2, 1, 2, -2, 2, 4];
 
// Size of array
var N = arr.length;
 
// Function Call
countOfSubarray(arr, N);
 
 
</script>
Producción

7

Complejidad temporal: O(N)
Espacio auxiliar: O(N)

Publicación traducida automáticamente

Artículo escrito por harsh16 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 *