📌  相关文章
📜  长度为K的子序列的最大按位OR值(1)

📅  最后修改于: 2023-12-03 15:28:36.105000             🧑  作者: Mango

长度为K的子序列的最大按位OR值

给定一个长度为n的整数数组nums和一个整数k,找出由nums中恰好k个元素组成的子序列的最大按位OR值。

示例:

输入: nums = [3,4,5,2,1,7,8,9], k = 4

输出: 15

解释:

所有可能的子序列为: [3,4,5,2], [3,4,5,1], [3,4,5,7], [3,4,5,8], [3,4,5,9], [3,4,2,1], [3,4,2,7], [3,4,2,8], [3,4,2,9], [3,4,1,7], [3,4,1,8], [3,4,1,9], [3,4,7,8], [3,4,7,9], [3,4,8,9], [3,5,2,1], [3,5,2,7], [3,5,2,8], [3,5,2,9], [3,5,1,7], [3,5,1,8], [3,5,1,9], [3,5,7,8], [3,5,7,9], [3,5,8,9], [3,2,1,7], [3,2,1,8], [3,2,1,9], [3,2,7,8], [3,2,7,9], [3,2,8,9], [3,1,7,8], [3,1,7,9], [3,1,8,9], [3,7,8,9], [4,5,2,1], [4,5,2,7], [4,5,2,8], [4,5,2,9], [4,5,1,7], [4,5,1,8], [4,5,1,9], [4,5,7,8], [4,5,7,9], [4,5,8,9], [4,2,1,7], [4,2,1,8], [4,2,1,9], [4,2,7,8], [4,2,7,9], [4,2,8,9], [4,1,7,8], [4,1,7,9], [4,1,8,9], [4,7,8,9], [5,2,1,7], [5,2,1,8], [5,2,1,9], [5,2,7,8], [5,2,7,9], [5,2,8,9], [5,1,7,8], [5,1,7,9], [5,1,8,9], [5,7,8,9], [2,1,7,8], [2,1,7,9], [2,1,8,9], [2,7,8,9], [1,7,8,9]

子序列的按位OR值如下:

3|4|5|2 = 7
3|4|5|1 = 7
3|4|5|7 = 7
3|4|5|8 = 15
3|4|5|9 = 15
3|4|2|1 = 7
3|4|2|7 = 7
3|4|2|8 = 14
3|4|2|9 = 15
3|4|1|7 = 7
3|4|1|8 = 15
3|4|1|9 = 15
3|4|7|8 = 15
3|4|7|9 = 15
3|4|8|9 = 15
3|5|2|1 = 7
3|5|2|7 = 7
3|5|2|8 = 15
3|5|2|9 = 15
3|5|1|7 = 7
3|5|1|8 = 15
3|5|1|9 = 15
3|5|7|8 = 15
3|5|7|9 = 15
3|5|8|9 = 15
3|2|1|7 = 7
3|2|1|8 = 10
3|2|1|9 = 11
3|2|7|8 = 15
3|2|7|9 = 15
3|2|8|9 = 11
3|1|7|8 = 15
3|1|7|9 = 15
3|1|8|9 = 11
3|7|8|9 = 15
4|5|2|1 = 7
4|5|2|7 = 7
4|5|2|8 = 14
4|5|2|9 = 15
4|5|1|7 = 7
4|5|1|8 = 14
4|5|1|9 = 15
4|5|7|8 = 15
4|5|7|9 = 15
4|5|8|9 = 15
4|2|1|7 = 7
4|2|1|8 = 10
4|2|1|9 = 11
4|2|7|8 = 14
4|2|7|9 = 15
4|2|8|9 = 11
4|1|7|8 = 15
4|1|7|9 = 15
4|1|8|9 = 11
4|7|8|9 = 15
5|2|1|7 = 7
5|2|1|8 = 10
5|2|1|9 = 11
5|2|7|8 = 15
5|2|7|9 = 15
5|2|8|9 = 11
5|1|7|8 = 15
5|1|7|9 = 15
5|1|8|9 = 11
5|7|8|9 = 15
2|1|7|8 = 15
2|1|7|9 = 11
2|1|8|9 = 11
2|7|8|9 = 15
1|7|8|9 = 15

因此,最大的按位OR值是15。

思路:

这道题可以用DFS递归做。由于需要找到长度为k的子序列,可以用DFS递归枚举所有长度为k的子序列的情况,即每次可以选择当前位置的元素加入子序列或不加入。然后更新当前的按位OR值,同时保留最大的按位OR值。

代码:

class Solution(object):
    def maxBitwiseOR(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: int
        """
        res = float('-inf')  # 初始化最大的按位OR值
        def dfs(pos, cnt, curOR):
            # pos 表示当前遍历到 nums 的第几个位置;
            # cnt 表示当前子序列的长度;
            # curOR 表示当前子序列的按位OR值
            nonlocal res  # 使用全局变量 res
            if cnt == k:
                res = max(res, curOR)  # 更新最大的按位OR值
                return
            if pos == len(nums):
                return
            dfs(pos + 1, cnt + 1, curOR | nums[pos])  # 选择当前位置的元素
            dfs(pos + 1, cnt, curOR)  # 不选择当前位置的元素
        dfs(0, 0, 0)  # 从第0个位置开始遍历
        return res

时间复杂度为 O(2^n),空间复杂度为 O(n)。由于此题数据范围较小,所以可以使用 DFS 递归做,但是对于数据范围较大的题,建议使用更高效的算法。