Dada una array arr[] que consiste en N enteros y un entero K , la tarea es encontrar el número máximo de pares que tengan una suma K posible de la array dada.
Nota: Cada elemento de la array puede ser parte de un solo par.
Ejemplos:
Entrada: arr[] = {1, 2, 3, 4}, K = 5
Salida: 2
Explicación: Los pares con la suma K de la array son (1, 4) y (2, 3).Entrada: arr[] = {3, 1, 3, 4, 3}, K = 6
Salida: 1
Explicación: el par con la suma K de la array es (3, 3).
Enfoque de dos puntos: la idea es utilizar la técnica de dos puntos . Siga los pasos a continuación para resolver el problema:
- Inicialice la variable ans como 0 para almacenar el número máximo de pares con la suma K .
- Ordene la array arr[] en orden creciente.
- Inicialice dos variables de índice L como 0 y R como (N – 1) para encontrar los elementos candidatos en la array ordenada.
- Iterar hasta que L sea menor que R y hacer lo siguiente:
- Comprueba si la suma de arr[L] y arr[R] es K o no. Si se determina que es cierto, entonces incremente ans y L en 1 y disminuya R en 1 .
- Si la suma de arr[L] y arr[R] es menor que K , entonces incremente L en 1 .
- De lo contrario, disminuya R en 1 .
- Después de los pasos anteriores, imprima el valor de ans como resultado.
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 to count the maximum number // of pairs from given array with sum K void maxPairs(int nums[], int n, int k) { // Sort array in increasing order sort(nums, nums + n); // Stores the final result int result = 0; // Initialize the left and right pointers int start = 0, end = n - 1; // Traverse array until start < end while (start < end) { if (nums[start] + nums[end] > k) // Decrement right by 1 end--; else if (nums[start] + nums[end] < k) // Increment left by 1 start++; // Increment result and left // pointer by 1 and decrement // right pointer by 1 else { start++; end--; result++; } } // Print the result cout << result << endl;; } // Driver Code int main() { int arr[] = { 1, 2, 3, 4 }; int n = sizeof(arr)/sizeof(arr[0]); int K = 5; // Function Call maxPairs(arr, n, K); return 0; } // This code is contributed by AnkThon
Java
// Java program for the above approach import java.io.*; import java.util.*; class GFG { // Function to count the maximum number // of pairs from given array with sum K public static void maxPairs(int[] nums, int k) { // Sort array in increasing order Arrays.sort(nums); // Stores the final result int result = 0; // Initialize the left and right pointers int start = 0, end = nums.length - 1; // Traverse array until start < end while (start < end) { if (nums[start] + nums[end] > k) // Decrement right by 1 end--; else if (nums[start] + nums[end] < k) // Increment left by 1 start++; // Increment result and left // pointer by 1 and decrement // right pointer by 1 else { start++; end--; result++; } } // Print the result System.out.println(result); } // Driver Code public static void main(String[] args) { int[] arr = { 1, 2, 3, 4 }; int K = 5; // Function Call maxPairs(arr, K); } }
Python3
# Python3 program for the above approach # Function to count the maximum number # of pairs from given array with sum K def maxPairs(nums, k): # Sort array in increasing order nums = sorted(nums) # Stores the final result result = 0 # Initialize the left and right pointers start, end = 0, len(nums) - 1 # Traverse array until start < end while (start < end): if (nums[start] + nums[end] > k): # Decrement right by 1 end -= 1 elif (nums[start] + nums[end] < k): # Increment left by 1 start += 1 # Increment result and left # pointer by 1 and decrement # right pointer by 1 else: start += 1 end -= 1 result += 1 # Print the result print(result) # Driver Code if __name__ == '__main__': arr = [ 1, 2, 3, 4 ] K = 5 # Function Call maxPairs(arr, K) # This code is contributed by mohit kumar 29
C#
// C# program for the above approach using System; class GFG{ // Function to count the maximum number // of pairs from given array with sum K public static void maxPairs(int[] nums, int k) { // Sort array in increasing order Array.Sort(nums); // Stores the final result int result = 0; // Initialize the left and right pointers int start = 0, end = nums.Length - 1; // Traverse array until start < end while (start < end) { if (nums[start] + nums[end] > k) // Decrement right by 1 end--; else if (nums[start] + nums[end] < k) // Increment left by 1 start++; // Increment result and left // pointer by 1 and decrement // right pointer by 1 else { start++; end--; result++; } } // Print the result Console.Write(result); } // Driver Code public static void Main() { int[] arr = { 1, 2, 3, 4 }; int K = 5; // Function Call maxPairs(arr, K); } } // This code is contributed by susmitakundugoaldanga
Javascript
<script> // JavaScript program for above approach // Function to count the maximum number // of pairs from given array with sum K function maxPairs(nums, k) { // Sort array in increasing order nums.sort(); // Stores the final result let result = 0; // Initialize the left and right pointers let start = 0, end = nums.length - 1; // Traverse array until start < end while (start < end) { if (nums[start] + nums[end] > k) // Decrement right by 1 end--; else if (nums[start] + nums[end] < k) // Increment left by 1 start++; // Increment result and left // pointer by 1 and decrement // right pointer by 1 else { start++; end--; result++; } } // Print the result document.write(result); } // Driver Code let arr = [ 1, 2, 3, 4 ]; let K = 5; // Function Call maxPairs(arr, K); </script>
Producción:
2
Complejidad de tiempo: O(N*log N)
Espacio auxiliar: O(1)
Enfoque eficiente: para optimizar el enfoque anterior, la idea es utilizar hashing . Siga los pasos a continuación para resolver el problema:
- Inicialice una variable, digamos ans , para almacenar el número máximo de pares con la suma K .
- Inicialice una tabla hash , digamos S , para almacenar la frecuencia de los elementos en arr[] .
- Recorra la array arr[] usando una variable, digamos i , y realice los siguientes pasos:
- Si la frecuencia de (K – arr[i]) es positiva, entonces incremente ans en 1 y disminuya la frecuencia de (K – arr[i]) en 1 .
- De lo contrario, inserte arr[i] con frecuencia 1 en la tabla hash.
- Después de completar los pasos anteriores, imprima el valor de ans como resultado.
A continuación se muestra la implementación del enfoque anterior:
C++
// C++ program for the above approach #include <bits/stdc++.h> #include <string.h> using namespace std; // Function to find the maximum number // of pairs with a sum K such that // same element can't be used twice void maxPairs(vector<int> nums, int k) { // Initialize a hashm map<int, int> m; // Store the final result int result = 0; // Iterate over the array nums[] for(auto i : nums) { // Decrement its frequency // in m and increment // the result by 1 if (m.find(i) != m.end() && m[i] > 0) { m[i] = m[i] - 1; result++; } // Increment its frequency by 1 // if it is already present in m. // Otherwise, set its frequency to 1 else { m[k - i] = m[k - i] + 1; } } // Print the result cout << result; } // Driver Code int main() { vector<int> arr = { 1, 2, 3, 4 }; int K = 5; // Function Call maxPairs(arr, K); } // This code is contributed by grand_master
Java
// Java program for the above approach import java.io.*; import java.util.*; class GFG { // Function to find the maximum number // of pairs with a sum K such that // same element can't be used twice public static void maxPairs( int[] nums, int k) { // Initialize a hashmap Map<Integer, Integer> map = new HashMap<>(); // Store the final result int result = 0; // Iterate over the array nums[] for (int i : nums) { // Decrement its frequency // in map and increment // the result by 1 if (map.containsKey(i) && map.get(i) > 0) { map.put(i, map.get(i) - 1); result++; } // Increment its frequency by 1 // if it is already present in map. // Otherwise, set its frequency to 1 else { map.put(k - i, map.getOrDefault(k - i, 0) + 1); } } // Print the result System.out.println(result); } // Driver Code public static void main(String[] args) { int[] arr = { 1, 2, 3, 4 }; int K = 5; // Function Call maxPairs(arr, K); } }
Python3
# Python3 program for the above approach # Function to find the maximum number # of pairs with a sum K such that # same element can't be used twice def maxPairs(nums, k) : # Initialize a hashm m = {} # Store the final result result = 0 # Iterate over the array nums[] for i in nums : # Decrement its frequency # in m and increment # the result by 1 if ((i in m) and m[i] > 0) : m[i] = m[i] - 1 result += 1 # Increment its frequency by 1 # if it is already present in m. # Otherwise, set its frequency to 1 else : if k - i in m : m[k - i] += 1 else : m[k - i] = 1 # Print the result print(result) # Driver code arr = [ 1, 2, 3, 4 ] K = 5 # Function Call maxPairs(arr, K) # This code is contributed by divyesh072019
C#
// C# program for the above approach using System; using System.Collections.Generic; class GFG { // Function to find the maximum number // of pairs with a sum K such that // same element can't be used twice public static void maxPairs( int[] nums, int k) { // Initialize a hashmap Dictionary<int, int> map = new Dictionary<int, int>(); // Store the readonly result int result = 0; // Iterate over the array nums[] foreach (int i in nums) { // Decrement its frequency // in map and increment // the result by 1 if (map.ContainsKey(i) && map[i] > 0) { map[i] = map[i] - 1; result++; } // Increment its frequency by 1 // if it is already present in map. // Otherwise, set its frequency to 1 else { if (!map.ContainsKey(k - i)) map.Add(k - i, 1); else map[i] = map[i] + 1; } } // Print the result Console.WriteLine(result); } // Driver Code public static void Main(String[] args) { int[] arr = {1, 2, 3, 4}; int K = 5; // Function Call maxPairs(arr, K); } } // This code is contributed by 29AjayKumar
Javascript
<script> // Javascript program for the above approach // Function to find the maximum number // of pairs with a sum K such that // same element can't be used twice function maxPairs(nums, k) { // Initialize a hashm var m = new Map(); // Store the final result var result = 0; // Iterate over the array nums[] nums.forEach(i => { // Decrement its frequency // in m and increment // the result by 1 if (m.has(i) && m.get(i) > 0) { m.set(i, m.get(i)-1); result++; } // Increment its frequency by 1 // if it is already present in m. // Otherwise, set its frequency to 1 else { if(m.has(k-i)) m.set(k-i, m.get(k-i)+1) else m.set(k-i, 1) } }); // Print the result document.write( result); } // Driver Code var arr = [1, 2, 3, 4]; var K = 5; // Function Call maxPairs(arr, K); </script>
2
Complejidad temporal: O(N)
Espacio auxiliar: O(N)
Publicación traducida automáticamente
Artículo escrito por rohit2sahu y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA