LeetCode 题解工作台

找出有效子序列的最大长度 I

给你一个整数数组 nums 。 nums 的子序列 sub 的长度为 x ,如果其满足以下条件,则称其为 有效子序列 : (sub[0] + sub[1]) % 2 == (sub[1] + sub[2]) % 2 == ... == (sub[x - 2] + sub[x - 1]) % 2 返回…

category

2

题型

code_blocks

7

代码语言

hub

3

相关题

当前训练重点

中等 · 状态·转移·动态规划

bolt

答案摘要

我们令 $k = 2$。 根据题目描述,我们可以得知,对于子序列 $a_1, a_2, a_3, \cdots, a_x$,如果满足 $(a_1 + a_2) \bmod k = (a_2 + a_3) \bmod k$。那么 $a_1 \bmod k = a_3 \bmod k$。也即是说,所有奇数项元素对 取模的结果相同,所有偶数项元素对 取模的结果相同。

Interview AiBox logo

Interview AiBox 实时 AI 助手,陪你讲清 状态·转移·动态规划 题型思路

试试 AiBox 面试助手arrow_forward
description

题目描述

给你一个整数数组 nums

nums 的子序列 sub 的长度为 x ,如果其满足以下条件,则称其为 有效子序列

  • (sub[0] + sub[1]) % 2 == (sub[1] + sub[2]) % 2 == ... == (sub[x - 2] + sub[x - 1]) % 2

返回 nums最长的有效子序列 的长度。

一个 子序列 指的是从原数组中删除一些元素(也可以不删除任何元素),剩余元素保持原来顺序组成的新数组。

 

示例 1:

输入: nums = [1,2,3,4]

输出: 4

解释:

最长的有效子序列是 [1, 2, 3, 4]

示例 2:

输入: nums = [1,2,1,1,2,1,2]

输出: 6

解释:

最长的有效子序列是 [1, 2, 1, 2, 1, 2]

示例 3:

输入: nums = [1,3]

输出: 2

解释:

最长的有效子序列是 [1, 3]

 

提示:

  • 2 <= nums.length <= 2 * 105
  • 1 <= nums[i] <= 107
lightbulb

解题思路

方法一:动态规划

我们令 k=2k = 2

根据题目描述,我们可以得知,对于子序列 a1,a2,a3,,axa_1, a_2, a_3, \cdots, a_x,如果满足 (a1+a2)modk=(a2+a3)modk(a_1 + a_2) \bmod k = (a_2 + a_3) \bmod k。那么 a1modk=a3modka_1 \bmod k = a_3 \bmod k。也即是说,所有奇数项元素对 kk 取模的结果相同,所有偶数项元素对 kk 取模的结果相同。

我们可以使用动态规划的方法解决这个问题。定义状态 f[x][y]f[x][y] 表示最后一项对 kk 取模为 xx,倒数第二项对 kk 取模为 yy 的最长有效子序列的长度。初始时 f[x][y]=0f[x][y] = 0

遍历数组 numsnums,对于每一个数 xx,我们得到 x=xmodkx = x \bmod k。然后我们可以枚举序列连续两个数对 jj 取模结果相同,其中 j[0,k)j \in [0, k)。那么 xx 的前一个数对 kk 取模结果为 y=(jx+k)modky = (j - x + k) \bmod k。此时 f[x][y]=f[y][x]+1f[x][y] = f[y][x] + 1

答案为所有 f[x][y]f[x][y] 中的最大值。

时间复杂度 O(n×k)O(n \times k),空间复杂度 O(k2)O(k^2)。其中 nn 为数组 nums\textit{nums} 的长度,而 k=2k=2

1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution:
    def maximumLength(self, nums: List[int]) -> int:
        k = 2
        f = [[0] * k for _ in range(k)]
        ans = 0
        for x in nums:
            x %= k
            for j in range(k):
                y = (j - x + k) % k
                f[x][y] = f[y][x] + 1
                ans = max(ans, f[x][y])
        return ans
speed

复杂度分析

指标
时间O(n)
空间O(1)
psychology

面试官常问的追问

外企场景
  • question_mark

    Look for familiarity with dynamic programming and state transitions.

  • question_mark

    Check if the candidate understands subsequence patterns and edge cases.

  • question_mark

    Observe how the candidate handles different subsequences' parity and alternating patterns.

warning

常见陷阱

外企场景
  • error

    Confusing the subsequence with a subarray, which requires contiguous elements.

  • error

    Forgetting to properly alternate between odd and even elements in valid subsequences.

  • error

    Not properly handling arrays with mixed parity that require alternating patterns.

swap_horiz

进阶变体

外企场景
  • arrow_right_alt

    Consider the case when all numbers are the same.

  • arrow_right_alt

    What if the array contains only even or only odd numbers?

  • arrow_right_alt

    How does the solution scale with the maximum array size?

help

常见问题

外企场景

找出有效子序列的最大长度 I题解:状态·转移·动态规划 | LeetCode #3201 中等