給你一個整數數組?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));
}