LeetCode Entry

3201. Find the Maximum Length of Valid Subsequence I

16.07.2025 medium 2025 kotlin rust

Longest same-pair-parity subsequence

3201. Find the Maximum Length of Valid Subsequence I medium blog post substack youtube 1.webp

Join me on Telegram

https://t.me/leetcode_daily_unstoppable/1051

Problem TLDR

Longest same-pair-parity subsequence #medium #greedy

Intuition

4 cases to consider, take greedily

    // 00000   -- valid (0+0=0)
    // 1111111 -- valid (1+1=0)
    // 010101  -- valid (1+0=1)
    // 101010 -- valid (1+0=1)
    // 0001010 -- invalid
    // 0001111 -- invalid

Approach

  • write CPU-branchless with bit tricks
  • use a single array for all 4 cases
  • two alterating cases 0-1 and 1-0 collapses into single with initial condition of first element

Complexity

  • Time complexity: \(O(n)\)

  • Space complexity: \(O(1)\)

Code


// 14ms
    fun maximumLength(n: IntArray): Int {
        val c = IntArray(4)
        for (x in n) { ++c[x % 2]; c[2 + x % 2] = 1 + c[3 - x % 2] }
        return c.max()
    }


// 8ms
    fun maximumLength(n: IntArray): Int {
        var zo = 0; var oz = 0
        var zonext = 0; var oznext = 1
        var allZeros = 0; var allOnes = 0
        for (x in n) {
            allZeros += 1 - (x % 2)
            allOnes += x % 2
            if (x % 2 == zonext) { ++zo; zonext = 1 - zonext }
            if (x % 2 == oznext) { ++oz; oznext = 1 - oznext }
        }
        return maxOf(allZeros, allOnes, zo, oz)
    }


// 2ms
    fun maximumLength(n: IntArray): Int {
        var az = 0; var ao = 0; var c = 0; var e = n[0] and 1
        for (x in n) {
            val p = x and 1; az += 1 - p; ao += p
            c += 1 - p xor e; e = e xor (1 - p xor e)
        }
        return max(max(az, ao), c)
    }


// 0ms
    pub fn maximum_length(n: Vec<i32>) -> i32 {
        let (mut a, mut b, mut c, mut e) = (0, 0, 0, n[0] & 1);
        for x in n {
            let p = x & 1; a += 1 - p; b += p;
            c += 1 - p ^ e; e = e ^ (1 - p ^ e);
        } a.max(b).max(c)
    }


// 0ms
    int maximumLength(vector<int>& n) {
        int a = 0, b = 0, c = 0, e = n[0] & 1;
        for (int x: n) a += 1 - x&1, b += x&1, c += (x&1) == e, e = e ^ ((x&1) == e);
        return max(max(a, b), c);
    }