LeetCode 题解工作台
找出有效子序列的最大长度 I
给你一个整数数组 nums 。 nums 的子序列 sub 的长度为 x ,如果其满足以下条件,则称其为 有效子序列 : (sub[0] + sub[1]) % 2 == (sub[1] + sub[2]) % 2 == ... == (sub[x - 2] + sub[x - 1]) % 2 返回…
2
题型
7
代码语言
3
相关题
当前训练重点
中等 · 状态·转移·动态规划
答案摘要
我们令 $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 AiBoxInterview AiBox 实时 AI 助手,陪你讲清 状态·转移·动态规划 题型思路
题目描述
给你一个整数数组 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 * 1051 <= nums[i] <= 107
解题思路
方法一:动态规划
我们令 。
根据题目描述,我们可以得知,对于子序列 ,如果满足 。那么 。也即是说,所有奇数项元素对 取模的结果相同,所有偶数项元素对 取模的结果相同。
我们可以使用动态规划的方法解决这个问题。定义状态 表示最后一项对 取模为 ,倒数第二项对 取模为 的最长有效子序列的长度。初始时 。
遍历数组 ,对于每一个数 ,我们得到 。然后我们可以枚举序列连续两个数对 取模结果相同,其中 。那么 的前一个数对 取模结果为 。此时 。
答案为所有 中的最大值。
时间复杂度 ,空间复杂度 。其中 为数组 的长度,而 。
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
复杂度分析
| 指标 | 值 |
|---|---|
| 时间 | O(n) |
| 空间 | O(1) |
面试官常问的追问
外企场景- 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.
常见陷阱
外企场景- 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.
进阶变体
外企场景- 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?