leetcode 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 * 10^5
1 <= nums[i] <= 10^7
分析:根据题意,最长子序列的组成可能有 3 种情况。1、全是奇数;2、全是偶数;3、奇偶相间。按照这三种情况分别遍历数组。
情况 1、2 比较简单。情况 3 可以先从数组开头开始,检查每个数与前一个数的奇偶性是否相同,如果不同,则将长度增加 1,否则不加。这样的得到的三个长度取最大值。
int maximumLength(int* nums, int numsSize) {int cnt[numsSize+5];int t=1,flag=0,even=0,odd=0;if(nums[0]&1)flag=1,cnt[0]=1;else flag=0,cnt[0]=2;for(int i=1;i<numsSize;++i){if((nums[i]&1)==flag)continue;else{if(nums[i]&1)flag=1,cnt[t++]=1;else flag=0,cnt[t++]=2;}}for(int i=0;i<numsSize;++i){if(nums[i]&1)odd++;else even++;}return fmax(t,fmax(even,odd));
}