leetcode 3201. 找出有效子序列的最大长度 I II
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 * 10e5
1 <= nums[i] <= 10e7
思路
要使(a + b) % 2 == (b + c) % 2
,则奇偶性为:([a,c], b)
(ac奇偶性一样,且和b不一样)。难道这题是最长递增子序列的做法?但是最长递增递增子序列的时间花费是O(N2)O(N^2)O(N2),而这题需要在O(N)O(N)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
}