Partition Array into Disjoint Intervals
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 inright
.left
andright
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:
2 <= A.length <= 30000
0 <= A[i] <= 10^6
It is guaranteed there is at least one way to partition
A
as described.
// We can easily do in O(N) space with leftMax & rightMin Arrays
class Solution {
// https://drive.google.com/file/d/1_5oQ8U-yjScAZprd8W_sgjGK84MjZDRE/view?usp=sharing
// O(1) space solution
public int partitionDisjoint(int[] A) {
// partition variables
int currentMax = A[0], index = 0;
// Overall variables
int max = A[0];
for (int i = 1; i < A.length; i++) {
max = Math.max(max, A[i]);
// If the current element does not violates our partition
if (A[i] >= currentMax)
continue;
// Else we need to increase our partition upto this point
else {
currentMax = max;
index = i;
}
}
return index + 1;
}
}
Last updated