1. 程式人生 > 其它 >2044. 統計按位或能得到最大值的子集數目

2044. 統計按位或能得到最大值的子集數目

給你一個整數陣列 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;
    }
}