📜  具有给定 AND 值的最长子序列(1)

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

具有给定 AND 值的最长子序列介绍

对于一个给定的数组,请找到其具有给定 AND 值的最长子序列的长度。下面介绍两种解法。

解法一

思路:枚举每一个子序列,计算其AND值,找到第一个值等于给定AND值的子序列,长度即为所求。

时间复杂度:$O(n^3)$

def findLongestSubsequence(nums, target):
    n = len(nums)
    res = 0
    for i in range(n):
        for j in range(i, n):
            t = nums[i]
            for k in range(i+1, j+1):
                t &= nums[k]
            if t == target:
                res = max(res, j-i+1)
    return res
解法二

思路:先枚举每一个数作为子序列的结尾,然后枚举该结尾之前的数构成的所有子序列,求出这些子序列的AND值,如果其中有值等于给定AND值,则更新答案。

时间复杂度:$O(n^2)$

def findLongestSubsequence(nums, target):
    n = len(nums)
    res = 0
    for i in range(n):
        t = nums[i]
        if t == target:
            res = max(res, 1)
        for j in range(i-1, -1, -1):
            t &= nums[j]
            if t == target:
                res = max(res, i-j)
    return res

以上两种解法,第二种时间复杂度更优,可以有效应对数据规模较大的情况。