Find the Maximum Length of Valid Subsequence I

medium dynamic programming parity subsequence

Problem

Given an integer array nums, a subsequence sub of length x is valid when every adjacent pair shares the same sum-parity: (sub[0]+sub[1]) % 2 == (sub[1]+sub[2]) % 2 == … == (sub[x-2]+sub[x-1]) % 2. Return the length of the longest valid subsequence.

Only parity matters. A valid subsequence is one of four shapes: all elements even, all odd, or strictly alternating even/odd. We try each shape and keep the longest.

Inputnums = [1, 2, 1, 1, 2, 1, 2]
Output6
The alternating subsequence [1, 2, 1, 2, 1, 2] has length 6 — every adjacent sum is odd.

def maximumLength(nums):
    best = 0
    # t = required parity of every adjacent sum (0 or 1)
    for t in range(2):
        cur = [0, 0]              # cur[r] = longest valid run ending in parity r
        for v in nums:
            r = v % 2             # parity of current element
            prev = (t - r) % 2    # parity the previous element must have
            cur[r] = cur[prev] + 1
        best = max(best, cur[0], cur[1])
    return best
function maximumLength(nums) {
  let best = 0;
  // t = required parity of every adjacent sum (0 or 1)
  for (let t = 0; t < 2; t++) {
    const cur = [0, 0];          // cur[r] = longest valid run ending in parity r
    for (const v of nums) {
      const r = v % 2;           // parity of current element
      const prev = (t - r + 2) % 2; // parity the previous element must have
      cur[r] = cur[prev] + 1;
    }
    best = Math.max(best, cur[0], cur[1]);
  }
  return best;
}
int maximumLength(int[] nums) {
    int best = 0;
    // t = required parity of every adjacent sum (0 or 1)
    for (int t = 0; t < 2; t++) {
        int[] cur = {0, 0};          // cur[r] = longest run ending in parity r
        for (int v : nums) {
            int r = v % 2;           // parity of current element
            int prev = (t - r + 2) % 2; // parity the previous element needs
            cur[r] = cur[prev] + 1;
        }
        best = Math.max(best, Math.max(cur[0], cur[1]));
    }
    return best;
}
int maximumLength(vector<int>& nums) {
    int best = 0;
    // t = required parity of every adjacent sum (0 or 1)
    for (int t = 0; t < 2; t++) {
        int cur[2] = {0, 0};         // cur[r] = longest run ending in parity r
        for (int v : nums) {
            int r = v % 2;           // parity of current element
            int prev = (t - r + 2) % 2; // parity the previous element needs
            cur[r] = cur[prev] + 1;
        }
        best = max(best, max(cur[0], cur[1]));
    }
    return best;
}
Time: O(n) Space: O(1)