Dada una array de enteros arr[] y un entero K , la tarea es encontrar el número de subconjuntos no vacíos S tales que min(S) + max(S) < K .
Ejemplos:
Entrada : arr[] = {2, 4, 5, 7} K = 8
Salida : 4
Explicación:
Los subconjuntos posibles son {2}, {2, 4}, {2, 4, 5} y {2, 5}
Entrada: : arr[] = {2, 4, 2, 5, 7} K = 10
Salida: 26
Acercarse
- Primero ordene la array de entrada.
- Ahora use la técnica de dos punteros para contar el número de subconjuntos.
- Tome dos punteros a la izquierda y a la derecha y establezca a la izquierda = 0 y a la derecha = N-1.
if (arr[left] + arr[right] < K )
Incremente el puntero izquierdo en 1 y agregue 2 j – i en la respuesta, porque los valores izquierdo y derecho constituyen los posibles valores finales de un subconjunto. Todos los valores de [i, j – 1] también forman parte de los subconjuntos que tendrán la suma < K. Entonces, necesitamos calcular todos los subconjuntos posibles para left = i y right ∊ [i, j]. Entonces, después de sumar los valores 2 j – i + 1 + 2 j – i – 2 + … + 2 0 del GP, obtenemos 2 j – i .
if( arr[left] + arr[right] >= K )
Disminuye el puntero derecho en 1.
- Repita el siguiente proceso hasta que la izquierda <= derecha .
A continuación se muestra la implementación del enfoque anterior:
C++
// C++ program to print count // of subsets S such that // min(S) + max(S) < K #include <bits/stdc++.h> using namespace std; // Function that return the // count of subset such that // min(S) + max(S) < K int get_subset_count(int arr[], int K, int N) { // Sorting the array sort(arr, arr + N); int left, right; left = 0; right = N - 1; // ans stores total number of subsets int ans = 0; while (left <= right) { if (arr[left] + arr[right] < K) { // add all possible subsets // between i and j ans += 1 << (right - left); left++; } else { // Decrease the sum right--; } } return ans; } // Driver code int main() { int arr[] = { 2, 4, 5, 7 }; int K = 8; int N = sizeof(arr) / sizeof(arr[0]); cout << get_subset_count(arr, K, N); return 0; }
Java
// Java program to print count // of subsets S such that // Math.min(S) + Math.max(S) < K import java.util.*; class GFG{ // Function that return the // count of subset such that // Math.min(S) + Math.max(S) < K static int get_subset_count(int arr[], int K, int N) { // Sorting the array Arrays.sort(arr); int left, right; left = 0; right = N - 1; // ans stores total number // of subsets int ans = 0; while (left <= right) { if (arr[left] + arr[right] < K) { // Add all possible subsets // between i and j ans += 1 << (right - left); left++; } else { // Decrease the sum right--; } } return ans; } // Driver code public static void main(String[] args) { int arr[] = { 2, 4, 5, 7 }; int K = 8; int N = arr.length; System.out.print(get_subset_count(arr, K, N)); } } // This code is contributed by Rajput-Ji
Python3
# Python3 program to print # count of subsets S such # that min(S) + max(S) < K # Function that return the # count of subset such that # min(S) + max(S) < K def get_subset_count(arr, K, N): # Sorting the array arr.sort() left = 0; right = N - 1; # ans stores total number of subsets ans = 0; while (left <= right): if (arr[left] + arr[right] < K): # Add all possible subsets # between i and j ans += 1 << (right - left); left += 1; else: # Decrease the sum right -= 1; return ans; # Driver code arr = [ 2, 4, 5, 7 ]; K = 8; print(get_subset_count(arr, K, 4)) # This code is contributed by grand_master
C#
// C# program to print count // of subsets S such that // Math.Min(S) + Math.Max(S) < K using System; class GFG{ // Function that return the // count of subset such that // Math.Min(S) + Math.Max(S) < K static int get_subset_count(int []arr, int K, int N) { // Sorting the array Array.Sort(arr); int left, right; left = 0; right = N - 1; // ans stores total number // of subsets int ans = 0; while (left <= right) { if (arr[left] + arr[right] < K) { // Add all possible subsets // between i and j ans += 1 << (right - left); left++; } else { // Decrease the sum right--; } } return ans; } // Driver code public static void Main(String[] args) { int []arr = { 2, 4, 5, 7 }; int K = 8; int N = arr.Length; Console.Write(get_subset_count(arr, K, N)); } } // This code is contributed by gauravrajput1
Javascript
<script> // JavaScript program to print count // of subsets S such that // Math.min(S) + Math.max(S) < K // Function that return the // count of subset such that // Math.min(S) + Math.max(S) < K function get_subset_count(arr,K,N) { // Sorting the array (arr).sort(function(a,b){return a-b;}); let left, right; left = 0; right = N - 1; // ans stores total number // of subsets let ans = 0; while (left <= right) { if (arr[left] + arr[right] < K) { // Add all possible subsets // between i and j ans += 1 << (right - left); left++; } else { // Decrease the sum right--; } } return ans; } // Driver code let arr=[ 2, 4, 5, 7]; let K = 8; let N = arr.length; document.write(get_subset_count(arr, K, N)); // This code is contributed by patel2127 </script>
4
Complejidad de tiempo: O(N* log N)
Espacio auxiliar: O(1)