周賽 404。

題目

輸入整數陣列 nums。

nums 的長度為 x 的有效子序列 sub 滿足:

  • (sub[0] + sub[1]) % 2 == (sub[1] + sub[2]) % 2 == … == (sub[x - 2] + sub[x - 1]) % 2

求 nums 的最長的有效子序列

解法

觀察子序列中元素的關係:

(sub[0] + sub[1]) % 2 == (sub[1] + sub[2]) % 2
(sub[1] + sub[2]) % 2 == (sub[2] + sub[3]) % 2

在模 2 的前提下,左右兩邊的 sub[1] 可以相消:

sub[0] % 2 == sub[2] % 2
sub[1] % 2 == sub[3] % 2

也就是子序列中的偶數項必須同餘、奇數向也必須同餘。有兩種可能:

  • 0,1,0,1
  • 1,0,1,0

但奇偶項的餘數也可以相同:

  • 0,0,0,0
  • 1,1,1,1

分別處理以上四種情況即可。

class Solution:
    def maximumLength(self, nums: List[int]) -> int:
        nums = [x % 2 for x in nums]
        
        def f(parity):
            res = 0
            for x in nums:
                if x % 2 == parity:
                    res += 1
                    parity ^= 1
            return res
        
        
        return max(
            nums.count(0),
            nums.count(1),
            f(0),
            f(1)
        )