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