2044. 統計按位或能得到最大值的子集數目
阿新 • • 發佈:2022-03-15
給你一個整數陣列 nums ,請你找出 nums 子集 按位或 可能得到的 最大值 ,並返回按位或能得到最大值的 不同非空子集的數目 。
如果陣列 a 可以由陣列 b 刪除一些元素(或不刪除)得到,則認為陣列 a 是陣列 b 的一個 子集 。如果選中的元素下標位置不一樣,則認為兩個子集 不同 。
對陣列 a 執行 按位或 ,結果等於 a[0] OR a[1] OR ... OR a[a.length - 1](下標從 0 開始)。
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/count-number-of-maximum-bitwise-or-subsets
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
列舉狀態
class Solution { public int countMaxOrSubsets(int[] nums) { if (nums == null || nums.length == 0) { return 0; } int maxVal = 0; int maxCnt = 0; for (int i = 0; i < (1 << nums.length); ++i) { int orVal = 0; for (int j = 0; j < nums.length; ++j) { if (((i >> j) & 1) == 1) { orVal |= nums[j]; } } if (orVal > maxVal) { maxVal = orVal; maxCnt = 1; } else if (orVal == maxVal) { maxCnt++; } } return maxCnt; } }
回溯
class Solution { private int maxVal = 0; private int maxCnt = 0; private void solve(int[] nums, int index, int orVal) { if (index == nums.length) { if (orVal > maxVal) { maxVal = orVal; maxCnt = 1; } else if (orVal == maxVal) { maxCnt++; } return; } solve(nums, index + 1, orVal); solve(nums, index + 1, orVal | nums[index]); } public int countMaxOrSubsets(int[] nums) { if (nums == null || nums.length == 0) { return 0; } solve(nums, 0, 0); return maxCnt; } }