Formatted question description: https://leetcode.ca/all/915.html

915. Partition Array into Disjoint Intervals

Level

Medium

Description

Given an array A, partition it into two (contiguous) subarrays left and right so that:

  • Every element in left is less than or equal to every element in right.
  • left and right are non-empty.
  • left has the smallest possible size.

Return the length of left after such a partitioning. It is guaranteed that such a partitioning exists.

Example 1:

Input: [5,0,3,8,6]

Output: 3

Explanation: left = [5,0,3], right = [8,6]

Example 2:

Input: [1,1,1,0,6,12]

Output: 4

Explanation: left = [1,1,1,0], right = [6,12]

Note:

  1. 2 <= A.length <= 30000
  2. 0 <= A[i] <= 10^6
  3. It is guaranteed there is at least one way to partition A as described.

Solution

Create an array minRight that has the same length as A, where minRight[i] represents the minimum element in the subarray A[i..A.length-1]. Then loop over A from left to right and maintain the maximum element met so far, which is maxLeft. Once an index such that maxLeft <= minRight[index + 1] is met, return index + 1. Since it is guaranteed that such a partitioning exists, the maximum possible return value is A.length - 1.

class Solution {
    public int partitionDisjoint(int[] A) {
        int length = A.length;
        int[] minRight = new int[length];
        minRight[length - 1] = A[length - 1];
        for (int i = length - 2; i >= 0; i--)
            minRight[i] = Math.min(minRight[i + 1], A[i]);
        int maxLeft = Integer.MIN_VALUE;
        for (int i = 0; i < length - 1; i++) {
            maxLeft = Math.max(maxLeft, A[i]);
            if (maxLeft <= minRight[i + 1])
                return i + 1;
        }
        return length - 1;
    }
}

All Problems

All Solutions