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.
public int partitionDisjoint(int[] A) {
int sizeA = A.length;
PriorityQueue<Integer> minHeap = new PriorityQueue<>();
PriorityQueue<Integer> maxHeap=new PriorityQueue<Integer>(sizeA, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2-o1;
}
});
for (int i = 0; i < sizeA; i++) {
if (i == 0) maxHeap.add(A[i]);
else minHeap.add(A[i]);
}
// left <= right
for (;;) {
int topMinHeap = minHeap.peek();
int topMaxHeap = maxHeap.peek();
if (topMaxHeap <= topMinHeap) {
return maxHeap.size();
} else {
int temp = A[maxHeap.size()];
maxHeap.add(temp);
minHeap.remove(temp);
}
}
}