3201. 找出有效子序列的最大长度 I
给你一个整数数组 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 * 10e51 <= nums[i] <= 10e7
思路
要使(a + b) % 2 == (b + c) % 2,则奇偶性为:([a,c], b)(ac奇偶性一样,且和b不一样)。难道这题是最长递增子序列的做法?但是最长递增递增子序列的时间花费是$O(N^2)$,而这题需要在$O(N)$内解决。
其实这题的思路同3202. 找出有效子序列的最大长度 II一模一样。
以下是分析3202. 找出有效子序列的最大长度 II的思路,即找到最长子序列满足:(a1 + a2) % k == (a2 + a3) % k == ...
我们先分析非模条件下的
如果我们可以假设m = a1 + a2 = a2 + a3
设f[i]为以i为结尾的最长满足条件的子序列,如果我们要把a3接到一个子序列上,子序列的结尾就必须为m-a3,即f[a3] = f[m-a3] + 1
对于模为k的条件下,m可以等于0~k-1
我们分别遍历m = 0..k-1,求出最大的答案就可以了
func maximumLength(nums []int) int {
return maximumLength_2(nums, 2)
}
func maximumLength_2(nums []int, k int) (ans int) {
f := make([]int, k)
for m := 0; m < k; m++ {
clear(f)
for _, x := range nums {
x %= k
f[x] = f[(m-x+k)%k] + 1
}
for _, x := range f {
ans = max(ans, x)
}
}
return
}