Минимальный подмассив такой, что количество единиц в конкатенации двоичного представления его элементов не менее K
Дан массив arr [], состоящий из неотрицательных целых чисел и целого числа k . Задача состоит в том, чтобы найти минимальную длину любого подмассива arr [] , чтобы, если все элементы этого подмассива представлены в двоичной нотации и объединены в двоичную строку, то количество единиц в результирующей строке будет не менее k . Если такой подмассив не существует, выведите -1 .
Примеры:
Input: arr[] = {4, 3, 7, 9}, k = 4
Output: 2
A possible sub-array is {3, 7}.Input: arr[] = {1, 2, 4, 8}, k = 2
Output: 2
Рекомендуется: сначала попробуйте свой подход в {IDE}, прежде чем переходить к решению.
Подход: идея состоит в том, чтобы использовать две переменные j и i и инициализировать их значениями 0 и 1 соответственно, а также массив count_one, который будет хранить количество присутствующих в двоичном представлении конкретного элемента массива и сумму переменных для хранения количество единиц до индекса и ответов для хранения минимальной длины. Теперь выполните итерацию по массиву, если количество единиц i-го или j-го элемента count_one равно k, затем обновите ans как 1, если сумма числа 1 до i-го элемента больше или равна k, обновите ans как минимум из ans и (ij) +1 , иначе, если оно меньше k, увеличьте j на 1, чтобы увеличить значение суммы .
Below is the implementation of the approach:
C++
// C++ implementation of the approach#include <bits/stdc++.h>using namespace std; // Finds the sub-array with maximum lengthint FindSubarray(int arr[], int n, int k){ // Array which stores number of ones // present in the binary representation // of ith element of the array int count_one[n]; for (int i = 0; i < n; i++) { count_one[i] = __builtin_popcount(arr[i]); } // Sum variable to store sum of // number of ones // Initialize it as number of ones // present in the binary representation // of 0th element of the array int sum = count_one[0]; // If there is only a single element if (n == 1) { if (count_one[0] >= k) return 1; else return -1; } // Stores the minimum length // of the required sub-array int ans = INT_MAX; int i = 1; int j = 0; while (i < n) { // If binary representation of jth // element of array has 1"s equal to k if (k == count_one[j]) { ans = 1; break; } // If binary representation of ith // element of array has 1"s equal to k else if (k == count_one[i]) { ans = 1; break; } // If sum of number of 1"s of // binary representation of elements upto // ith element is less than k else if (sum + count_one[i] < k) { sum += count_one[i]; i++; } // If sum of number of 1"s of // binary representation of elements upto // ith element is greater than k else if (sum + count_one[i] > k) { ans = min(ans, (i - j) + 1); sum -= count_one[j]; j++; } else if (sum + count_one[i] == k) { ans = min(ans, (i - j) + 1); sum += count_one[i]; i++; } } if (ans != INT_MAX) return ans; else return -1;} // Driver codeint main(){ int arr[] = { 1, 2, 4, 8 }; int n = sizeof(arr) / sizeof(int); int k = 2; cout << FindSubarray(arr, n, k); return 0;} |
Java
// Java implementation of the approachclass GFG{ // Finds the sub-array with maximum lengthstatic int FindSubarray(int arr[], int n, int k){ // Array which stores number of ones // present in the binary representation // of ith element of the array int []count_one = new int[n]; for (int i = 0; i < n; i++) { count_one[i] = Integer.bitCount(arr[i]); } // Sum variable to store sum of // number of ones // Initialize it as number of ones // present in the binary representation // of 0th element of the array int sum = count_one[0]; // If there is only a single element if (n == 1) { if (count_one[0] >= k) return 1; else return -1; } // Stores the minimum length // of the required sub-array int ans = Integer.MAX_VALUE; int i = 1; int j = 0; while (i < n) { // If binary representation of jth // element of array has 1"s equal to k if (k == count_one[j]) { ans = 1; break; } // If binary representation of ith // element of array has 1"s equal to k else if (k == count_one[i]) { ans = 1; break; } // If sum of number of 1"s of // binary representation of elements upto // ith element is less than k else if (sum + count_one[i] < k) { sum += count_one[i]; i++; } // If sum of number of 1"s of // binary representation of elements upto // ith element is greater than k else if (sum + count_one[i] > k) { ans = Math.min(ans, (i - j) + 1); sum -= count_one[j]; j++; } else if (sum + count_one[i] == k) { ans = Math.min(ans, (i - j) + 1); sum += count_one[i]; i++; } } if (ans != Integer.MAX_VALUE) return ans; else return -1;} // Driver codepublic static void main(String[] args) { int arr[] = { 1, 2, 4, 8 }; int n = arr.length; int k = 2; System.out.println(FindSubarray(arr, n, k));}} // This code is contributed by Princi Singh |
Python3
# Python3 implementation of the approach import sys; # Finds the sub-array with maximum length def FindSubarray(arr, n, k) : # Array which stores number of ones # present in the binary representation # of ith element of the array count_one = [0] * n; for i in range(n) : count_one[i] = bin(arr[i]).count("1"); # Sum variable to store sum of # number of ones # Initialize it as number of ones # present in the binary representation # of 0th element of the array sum = count_one[0]; # If there is only a single element if (n == 1) : if (count_one[0] >= k) : return 1; else : return -1; # Stores the minimum length # of the required sub-array ans = sys.maxsize; i = 1; j = 0; while (i < n) : # If binary representation of jth # element of array has 1"s equal to k if (k == count_one[j]) : ans = 1; break; # If binary representation of ith # element of array has 1"s equal to k elif (k == count_one[i]) : ans = 1; break; # If sum of number of 1"s of # binary representation of elements upto # ith element is less than k elif (sum + count_one[i] < k) : sum += count_one[i]; i += 1; # If sum of number of 1"s of # binary representation of elements upto # ith element is greater than k elif (sum + count_one[i] > k) : ans = min(ans, (i - j) + 1); sum -= count_one[j]; j += 1; elif (sum + count_one[i] == k) : ans = min(ans, (i - j) + 1); sum += count_one[i]; i += 1; if (ans != sys.maxsize) : return ans; else : return -1; # Driver code if __name__ == "__main__" : arr = [ 1, 2, 4, 8 ]; n = len(arr); k = 2; print(FindSubarray(arr, n, k)); # This code is contributed by Ryuga |
C#
// C# implementation of the approachusing System; class GFG{ // Finds the sub-array with maximum lengthstatic int FindSubarray(int []arr, int n, int k){ // Array which stores number of ones // present in the binary representation // of ith element of the array int []count_one = new int[n]; int i = 0; for (i = 0; i < n; i++) { count_one[i] = bitCount(arr[i]); } // Sum variable to store sum of // number of ones // Initialize it as number of ones // present in the binary representation // of 0th element of the array int sum = count_one[0]; // If there is only a single element if (n == 1) { if (count_one[0] >= k) return 1; else return -1; } // Stores the minimum length // of the required sub-array int ans = int.MaxValue; i = 1; int j = 0; while (i < n) { // If binary representation of jth // element of array has 1"s equal to k if (k == count_one[j]) { ans = 1; break; } // If binary representation of ith // element of array has 1"s equal to k else if (k == count_one[i]) { ans = 1; break; } // If sum of number of 1"s of // binary representation of elements upto // ith element is less than k else if (sum + count_one[i] < k) { sum += count_one[i]; РЕКОМЕНДУЕМЫЕ СТАТЬИ |