Leetcode 3202. Find the Maximum Length of Valid Subsequence II

1. 解题思路

这一题的话是上一题3201. Find the Maximum Length of Valid Subsequence I的升级版,主要就是将除数2调整为任意正数k,但是本质上还是一样的,我们同样有奇数位和偶数位上的数必然对k有着相同的余数,此时,我们只需要考察前两个元素的余数组合,然后考察他们的所有位置能够组成的交叉序列的最大长度即可。

当前两个元素的余数相同时,我们能够获得的最大子序列的长度就是k的余数相同的元素出现的最大频次。

当前两个元素的余数不同时,我们能够快速得到两个余数的位置序列,然后我们通过贪婪算法配合二分搜索即可快速得到他们能够组成的最大交叉序列长度。

最后,如果两个序列的长度之后都小于当前已经获得的最大序列长度了,我们就可以直接跳过这些可能性了,由此,我们即可进一步对问题进行剪枝,从而得到我们最终的答案。

2. 代码实现

给出python代码实现如下:

class Solution:
    def maximumLength(self, nums: List[int], k: int) -> int:
        locs = defaultdict(list)
        for i, x in enumerate(nums):
            locs[x%k].append(i)
        ans = max(len(x) for x in locs.values())
        
        def get_max_length(s1, s2):
            n, m = len(s1), len(s2)
            i, j = 0, 0
            cnt = 1 if s2[0] < s1[0] else 0
            while i < n:
                cnt += 1
                j = bisect.bisect_left(s2, s1[i])
                if j < m:
                    cnt += 1
                else:
                    break
                i = bisect.bisect_left(s1, s2[j])
            return cnt
        
        for i in range(k-1):
            if locs[i] == []:
                continue
            for j in range(i+1, k):
                if len(locs[i]) + len(locs[j]) <= ans:
                    continue
                cnt = get_max_length(locs[i], locs[j])
                ans = max(ans, cnt)
        return ans

提交代码评测得到:耗时277ms,占用内存16.8MB。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值