1671. Minimum Number of Removals to Make Mountain Array 
Description 
You may recall that an array arr is a mountain array if and only if:
- arr.length >= 3
- There exists some index i(0-indexed) with0 < i < arr.length - 1such that:- arr[0] < arr[1] < ... < arr[i - 1] < arr[i]
- arr[i] > arr[i + 1] > ... > arr[arr.length - 1]
 
Given an integer array nums, return the minimum number of elements to remove to make numsa mountain array.
Example 1:
Input: nums = [1,3,1] Output: 0 Explanation: The array itself is a mountain array so we do not need to remove any elements.
Example 2:
Input: nums = [2,1,1,5,6,2,3,1] Output: 3 Explanation: One solution is to remove the elements at indices 0, 1, and 5, making the array nums = [1,5,6,3,1].
Constraints:
- 3 <= nums.length <= 1000
- 1 <= nums[i] <= 109
- It is guaranteed that you can make a mountain array out of nums.
Solutions 
Solution: Dynamic Programming + Binary Search
- Time complexity: O(nlogn)
- Space complexity: O(n)
JavaScript 
js
/**
 * @param {number[]} nums
 * @return {number}
 */
const minimumMountainRemovals = function (nums) {
  const n = nums.length;
  const findFirstLargeIndex = (elements, target) => {
    let left = 0;
    let right = elements.length;
    while (left < right) {
      const mid = Math.floor((left + right) / 2);
      elements[mid] >= target ? (right = mid) : (left = mid + 1);
    }
    return left;
  };
  const lengthOfLIS = elements => {
    const result = new Array(n).fill(0);
    const current = [];
    for (let index = 0; index < n; index++) {
      const element = elements[index];
      const firstIndex = findFirstLargeIndex(current, element);
      current[firstIndex] = element;
      result[index] = current.length;
    }
    return result;
  };
  const leftLengthOfLIS = lengthOfLIS(nums);
  const rightLengthOfLIS = lengthOfLIS([...nums].reverse()).reverse();
  let result = 0;
  for (let index = 0; index < n; index++) {
    const left = leftLengthOfLIS[index];
    const right = rightLengthOfLIS[index];
    if (left < 2 || right < 2) continue;
    result = Math.max(left + right - 1, result);
  }
  return n - result;
};