2275. Найбільша комбінація з бітовим AND, що більше за нуль

pic

Маючи список цілих чисел, потрібно повернути розмір найбільшої комбінації цілих чисел, бітове AND яких більше за 0.

Отже, питання полягає в тому, щоб знайти розмір найбільшої комбінації цілих чисел, так щоб їх бітове AND давало число більше за 0. Ми знаємо одну річ про бітовий оператор AND; він обнуляє всі непарні біти.

Наприклад ->

5&17
00101
10001
— — — -
00001

Тепер наша мета змінюється: знайти найбільший список цілих чисел, у яких є хоча б один спільний біт. Добре, ми також знаємо, що максимальний розмір числа поміститься в 32-розрядне ціле. Чи можемо ми просто створити масив з 32 елементів для обчислення, скільки чисел у списку мають цей конкретний біт увімкненим? Це допоможе вирішити задачу, оскільки ми будемо знати, скільки чисел мають увімкнений цей біт.

Розглянемо приклад 8-розрядних чисел:

[16,17,71,62,12,24,14]  
00010000 -> 16  
00010001 -> 17  
01000111 -> 71  
00111110 -> 62  
00001100 -> 12  
00011000 -> 24  
00001110 -> 14  
set_bit_count_array = [0,0,0,0,0,0,0,0] // розмір масиву 8  

Тепер порахуємо, скільки чисел мають увімкнений певний біт. Якщо взяти 16,  
він увімкне 5-й біт, і так далі. Тепер масив стає таким:  
[2,2,4,4,2,1]  
Тепер ми знаємо, що є максимум 4 числа, які мають спільний біт, і якщо ми виконаємо  
операції бітового AND для цих чисел, відповідь не буде 0, оскільки цей біт залишиться  
увімкненим.

Це і відповідає на наше питання.
Код:

class Solution {  
public:  
 int largestCombination(vector& candidates) {  
 vector bitsSetCount(32, 0);  
 int mx = 0;  
 for (int candidate: candidates) {  
 for (int i = 0; i < 32; i++) {  
 if ((candidate >> i) & 1)  
 bitsSetCount[i]++;  
 }  
 }  

 for (int bit: bitsSetCount) {  
 mx = max(bit, mx);  
 cout << bit << " ";  
 }  
 cout << "\n";  

 return mx;  
 }  
};

Дякую.

Перекладено з: 2275. Largest Combination With Bitwise AND Greater Than Zero

Leave a Reply

Your email address will not be published. Required fields are marked *