Minimum Deletions to Make Array Beautiful

medium stack greedy parity

Problem

An array is beautiful when its length is even and nums[i] != nums[i+1] for every even index i. Deleting an element shifts everything to its right one slot left. Return the minimum number of deletions needed to make nums beautiful (an empty array counts as beautiful).

Inputnums = [1,1,2,3,5]
Output1
Delete one of the leading 1s to get [1,2,3,5], which is beautiful.
Inputnums = [1,1,2,2,3,3]
Output2
Delete nums[0] and a trailing element to leave [1,2,2,3].

def min_deletions(nums):
    deletions = 0
    stack = []                    # kept elements
    for v in nums:
        if len(stack) % 2 == 1 and stack[-1] == v:
            deletions += 1        # equal pair start, delete v
        else:
            stack.append(v)       # keep v
    if len(stack) % 2 == 1:
        deletions += 1            # drop the lone trailing element
    return deletions
function minDeletions(nums) {
  let deletions = 0;
  const stack = [];                       // kept elements
  for (const v of nums) {
    if (stack.length % 2 === 1 && stack[stack.length - 1] === v) {
      deletions++;                         // equal pair start, delete v
    } else {
      stack.push(v);                       // keep v
    }
  }
  if (stack.length % 2 === 1) deletions++; // drop lone trailing element
  return deletions;
}
int minDeletions(int[] nums) {
    int deletions = 0;
    Deque<Integer> stack = new ArrayDeque<>();
    for (int v : nums) {
        if (stack.size() % 2 == 1 && stack.peekLast() == v) {
            deletions++;                     // equal pair start, delete v
        } else {
            stack.addLast(v);                // keep v
        }
    }
    if (stack.size() % 2 == 1) deletions++;  // drop lone trailing element
    return deletions;
}
int minDeletions(vector<int>& nums) {
    int deletions = 0;
    vector<int> stk;                          // kept elements
    for (int v : nums) {
        if (stk.size() % 2 == 1 && stk.back() == v) {
            deletions++;                       // equal pair start, delete v
        } else {
            stk.push_back(v);                  // keep v
        }
    }
    if (stk.size() % 2 == 1) deletions++;      // drop lone trailing element
    return deletions;
}
Time: O(n) Space: O(n)