Skip to content

Latest commit

 

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 

README.md

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.
 

Related Topics:
Array

Solution 1. Mono Deque

// OJ: https://leetcode.com/problems/partition-array-into-disjoint-intervals/
// Author: github.com/lzl124631x
// Time: O(N)
// Space: O(N)
class Solution {
public:
    int partitionDisjoint(vector<int>& A) {
        deque<int> q; // index
        int N = A.size(), mx = 0;
        for (int i = 0; i < N; ++i) {
            while (q.size() && A[q.back()] >= A[i]) q.pop_back();
            q.push_back(i);
        }
        for (int i = 0; i < N; ++i) {
            if (q.front() == i) q.pop_front();
            mx = max(mx, A[i]);
            if (mx <= A[q.front()]) return i + 1;
        }
        return -1;
    }
};