Back to all solutions

#2780 - Minimum Index of a Valid Split

Problem Description

An element x of an integer array arr of length m is dominant if more than half the elements of arr have a value of x.

You are given a 0-indexed integer array nums of length n with one dominant element.

You can split nums at an index i into two arrays nums[0, ..., i] and nums[i + 1, ..., n - 1], but the split is only valid if:

  • 0 <= i < n - 1
  • nums[0, ..., i], and nums[i + 1, ..., n - 1] have the same dominant element.

Here, nums[i, ..., j] denotes the subarray of nums starting at index i and ending at index j, both ends being inclusive. Particularly, if j < i then nums[i, ..., j] denotes an empty subarray.

Return the minimum index of a valid split. If no valid split exists, return -1.

Solution

/**
 * @param {number[]} nums
 * @return {number}
 */
var minimumIndex = function(nums) {
  const map = new Map();

  for (const num of nums) {
    map.set(num, (map.get(num) || 0) + 1);
  }

  let dominantElement;
  for (const [num, count] of map) {
    if (count * 2 > nums.length) {
      dominantElement = num;
      break;
    }
  }

  let leftCount = 0;
  for (let i = 0; i < nums.length - 1; i++) {
    leftCount += nums[i] === dominantElement ? 1 : 0;
    const rightCount = map.get(dominantElement) - leftCount;

    if (leftCount * 2 > i + 1 && rightCount * 2 > nums.length - i - 1) {
      return i;
    }
  }

  return -1;
};