Encuentre elementos de array iguales a la suma de cualquier subarreglo de al menos tamaño 2

Dada una array arr[] , la tarea es encontrar los elementos de la array que son iguales a la suma de cualquier sub-array de tamaño mayor que 1.
Ejemplos: 

Entrada: arr[] = {1, 2, 3, 4, 5, 6} 
Salida: 3, 5, 6 
Explicación: 
Los elementos 3, 5, 6 son iguales a la suma de los subarreglos {1, 2}, {2, 3} y {1, 2, 3} respectivamente.
Entrada: arr[] = {5, 6, 10, 1, 3, 4, 8, 16} 
Salida: 4, 8, 16 
Explicación: 
Los elementos 4, 8, 16 son iguales a la suma de los subarreglos {1, 3 }, {1, 3, 4}, {1, 3, 4, 8} respectivamente 
 

Enfoque: La idea es usar una array de suma de prefijos para resolver el problema dado. Cree una array de prefijos [] que almacene la suma de prefijos de todos sus elementos anteriores para cada índice. Almacene la suma de todos los subarreglos en un mapa y busque si algún elemento del arreglo está presente en el mapa o no.
A continuación se muestra la implementación del enfoque anterior: 
 

C++

// C++ implementation to find array
// elements equal to the sum
// of any subarray of at least size 2
 
#include <bits/stdc++.h>
using namespace std;
 
// Function to find all elements
void findElements(int* arr, int n)
{
    if (n == 1)
        return;
 
    int pre[n];
 
    // Create a prefix array
    pre[0] = arr[0];
 
    for (int i = 1; i < n; i++)
        pre[i] = arr[i] + pre[i - 1];
 
    unordered_map<int, bool> mp;
 
    // Mark the sum of all sub arrays as true
    for (int i = 1; i < n - 1; i++) {
        mp[pre[i]] = true;
 
        for (int j = i + 1; j < n; j++) {
            mp[pre[j] - pre[i - 1]] = true;
        }
    }
 
    // Check all elements
    // which are marked
    // true in the map
    for (int i = 0; i < n; i++) {
        if (mp[arr[i]]) {
            cout << arr[i] << " ";
        }
    }
    cout << endl;
}
 
// Driver Code
int main()
{
    int arr1[] = { 1, 2, 3, 4, 5, 6 };
 
    int n1 = sizeof(arr1) / sizeof(arr1[0]);
 
    findElements(arr1, n1);
 
    return 0;
}

Java

// Java implementation to find array
// elements equal to the sum of any
// subarray of at least size 2
import java.util.*;
 
class GFG{
     
// Function to find all elements
static void findElements(int[] arr, int n)
{
    if (n == 1)
        return;
 
    int pre[] = new int[n];
 
    // Create a prefix array
    pre[0] = arr[0];
 
    for(int i = 1; i < n; i++)
        pre[i] = arr[i] + pre[i - 1];
 
    HashMap<Integer, Boolean> mp = new HashMap<>();
 
    // Mark the sum of all sub arrays as true
    for(int i = 1; i < n - 1; i++)
    {
        mp.put(pre[i], true);
 
        for(int j = i + 1; j < n; j++)
        {
            mp.put(pre[j] - pre[i - 1], true);
        }
    }
 
    // Check all elements
    // which are marked
    // true in the map
    for(int i = 0; i < n; i++)
    {
        if (mp.get(arr[i]) != null)
        {
            System.out.print(arr[i] + " ");
        }
    }
    System.out.println();
}
 
// Driver Code
public static void main(String[] args)
{
    int arr1[] = { 1, 2, 3, 4, 5, 6 };
 
    int n1 = arr1.length;
 
    findElements(arr1, n1);
}
}
 
// This code is contributed by jrishabh99

Python3

# Python3 implementation to find array
# elements equal to the sum of any
# subarray of at least size 2
 
# Function to find all elements
def findElements(arr, n):
 
    if (n == 1):
        return;
 
    pre = [0] * n;
 
    # Create a prefix array
    pre[0] = arr[0];
 
    for i in range(1, n):
        pre[i] = arr[i] + pre[i - 1];
 
    mp = {};
 
    # Mark the sum of all sub arrays as true
    for i in range(1, n - 1):
        mp[pre[i]] = True;
 
        for j in range(i + 1, n):
            mp[pre[j] - pre[i - 1]] = True;
 
    # Check all elements which
    # are marked true in the map
    for i in range(n):
        if arr[i] in mp:
            print(arr[i], end = " ");
        else:
            pass
     
    print()
 
# Driver Code
if __name__ == "__main__":
 
    arr1 = [ 1, 2, 3, 4, 5, 6 ];
    n1 = len(arr1);
 
    findElements(arr1, n1);
     
# This code is contributed by AnkitRai01

C#

// C# implementation to find array
// elements equal to the sum of any
// subarray of at least size 2
using System;
using System.Collections.Generic;
class GFG{
     
// Function to find all elements
static void findElements(int[] arr,
                         int n)
{
  if (n == 1)
    return;
 
  int []pre = new int[n];
 
  // Create a prefix array
  pre[0] = arr[0];
 
  for(int i = 1; i < n; i++)
    pre[i] = arr[i] + pre[i - 1];
 
  Dictionary<int,
             Boolean> mp = new Dictionary<int,
                                          Boolean>();
 
  // Mark the sum of all sub arrays as true
  for(int i = 1; i < n - 1; i++)
  {
    if(!mp.ContainsKey(pre[i]))
      mp.Add(pre[i], true);
 
    for(int j = i + 1; j < n; j++)
    {
      if(!mp.ContainsKey(pre[j] - pre[i - 1]))
        mp.Add(pre[j] - pre[i - 1], true);
    }
  }
 
  // Check all elements
  // which are marked
  // true in the map
  for(int i = 0; i < n; i++)
  {
    if (mp.ContainsKey(arr[i]))
    {
      Console.Write(arr[i] + " ");
    }
  }
  Console.WriteLine();
}
 
// Driver Code
public static void Main(String[] args)
{
  int []arr1 = {1, 2, 3, 4, 5, 6};
  int n1 = arr1.Length;
  findElements(arr1, n1);
}
}
 
// This code is contributed by gauravrajput1

Javascript

<script>
 
// Javascript implementation to find array
// elements equal to the sum of any
// subarray of at least size 2
 
// Function to find all elements
function findElements(arr, n)
{
    if (n == 1)
        return;
  
    let pre = Array.from({length: n}, (_, i) => 0);
  
    // Create a prefix array
    pre[0] = arr[0];
  
    for(let i = 1; i < n; i++)
        pre[i] = arr[i] + pre[i - 1];
  
    let mp = new Map();
  
    // Mark the sum of all sub arrays as true
    for(let i = 1; i < n - 1; i++)
    {
        mp.set(pre[i], true);
  
        for(let j = i + 1; j < n; j++)
        {
            mp.set(pre[j] - pre[i - 1], true);
        }
    }
  
    // Check all elements
    // which are marked
    // true in the map
    for(let i = 0; i < n; i++)
    {
        if (mp.get(arr[i]) != null)
        {
            document.write(arr[i] + " ");
        }
    }
    document.write("<br/>");
}
 
// Driver code
     
      let arr1 = [ 1, 2, 3, 4, 5, 6 ];
  
    let n1 = arr1.length;
  
    findElements(arr1, n1);
  
 // This code is contributed by souravghosh0416.
</script>
Producción: 

3 5 6

 

Publicación traducida automáticamente

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