📅  最后修改于: 2023-12-03 15:28:36.105000             🧑  作者: Mango
给定一个长度为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 递归做,但是对于数据范围较大的题,建议使用更高效的算法。