[LeetCode] 2275. Largest Combination With Bitwise AND Greater Than Zero

CNoodle發表於2024-11-08

The bitwise AND of an array nums is the bitwise AND of all integers in nums.

For example, for nums = [1, 5, 3], the bitwise AND is equal to 1 & 5 & 3 = 1.
Also, for nums = [7], the bitwise AND is 7.
You are given an array of positive integers candidates. Evaluate the bitwise AND of every combination of numbers of candidates. Each number in candidates may only be used once in each combination.

Return the size of the largest combination of candidates with a bitwise AND greater than 0.

Example 1:
Input: candidates = [16,17,71,62,12,24,14]
Output: 4
Explanation: The combination [16,17,62,24] has a bitwise AND of 16 & 17 & 62 & 24 = 16 > 0.
The size of the combination is 4.
It can be shown that no combination with a size greater than 4 has a bitwise AND greater than 0.
Note that more than one combination may have the largest size.
For example, the combination [62,12,24,14] has a bitwise AND of 62 & 12 & 24 & 14 = 8 > 0.

Example 2:
Input: candidates = [8,8]
Output: 2
Explanation: The largest combination [8,8] has a bitwise AND of 8 & 8 = 8 > 0.
The size of the combination is 2, so we return 2.

Constraints:
1 <= candidates.length <= 105
1 <= candidates[i] <= 107

按位與結果大於零的最長組合。

對陣列 nums 執行 按位與 相當於對陣列 nums 中的所有整數執行 按位與 。

例如,對 nums = [1, 5, 3] 來說,按位與等於 1 & 5 & 3 = 1 。
同樣,對 nums = [7] 而言,按位與等於 7 。
給你一個正整數陣列 candidates 。計算 candidates 中的數字每種組合下 按位與 的結果。 candidates 中的每個數字在每種組合中只能使用 一次 。

返回按位與結果大於 0 的 最長 組合的長度。

思路

這是一道位運算的題。因為題目要求我們找到是一個數字組合,這個組合需要滿足的條件是他們的 AND 操作要最大。但是因為這個組合裡的數字個數不定,所以沒法用類似 backtracking 那樣的方法去列舉;且問的是 AND 操作的最大值,所以思路只能往 bit manipulation 上靠。

假如所有數字可以用 8 個 digit 表達完 (0000 0000),那麼使 AND 的結果最大的方式就是最高位最好都是 1。那麼我們可以從二進位制的低位(右邊)遍歷到高位,統計一下每個數字的二進位制表達裡每個位置上的 1 的情況,用一個 map 記錄一下。在遍歷過程中記錄出現 1 的最大次數。因為是從右往左掃描的所以最大次數越往左,結果越大。

複雜度

時間O(n) - candidates 陣列遍歷一次
空間O(1)

程式碼

Java實現

class Solution {
    public int largestCombination(int[] candidates) {
        int[] map = new int[24];
		int max = 0;
		for (int candidate : candidates) {
			for (int i = 0; i < 24; i++) {
				if ((candidate & (1 << i)) > 0) {
					map[i]++;
					max = Math.max(max, map[i]);
				}
			}
		}
		return max;
    }
}

相關文章