You are given an integer array nums of length n, where nums is a permutation of the integers in the range [0, n - 1].
You are also given an integer array pre, where each pre[i] is a valid prefix length.
In one operation, you may choose any length x from pre and reverse the first x elements of nums.
For example, applying a prefix reversal of length 3 on [4, 1, 2, 3] results in [2, 1, 4, 3].
Return the minimum number of operations required to sort nums in ascending order. If it is impossible to sort nums, return -1.
Β
Example 1:
Input:nums = [2,0,1], pre = [2,3]
Output:2
Explanation:
Reverse pre[1] = 3 elements to get nums = [1, 0, 2].
Then reverse pre[0] = 2 elements to get nums = [0, 1, 2].
Thus, the minimum number of prefix reversal required is 2.
Example 2:
Input:nums = [1,0,2], pre = [1,3]
Output:-1
Explanation:
It is impossible to sort the array using the given prefix lengths, so the answer is -1.
Example 3:
Input:nums = [0,1], pre = [2]
Output:0
Explanation:
Since nums is already sorted, no prefix reversals are needed. Thus, the answer is 0.
Β
Constraints:
1 <= n == nums.length <= 8
0 <= nums[i] <= n - 1
1 <= pre.length <= n
1 <= pre[i] <= n
βββββββnums is a permutation of integers from 0 to n - 1.
pre consists of unique integers.
Solutions
Solution 1: BFS
Since \(n \le 8\), the number of permutations is at most \(8! = 40320\), so we can use BFS to find the minimum number of operations.
Treat the current array as a state, and the target state is \([0, 1, \ldots, n - 1]\). If the initial state is already the target, return \(0\). Otherwise, start BFS from the initial state: each time take a state from the queue, enumerate every prefix length \(x\) in \(\textit{pre}\), and reverse the first \(x\) elements to obtain a new state. If the new state equals the target, return the current number of steps; otherwise, if it has not been visited, enqueue it. If the search finishes without reaching the target, return \(-1\).
For convenience of deduplication, encode each permutation as an integer in base \(8\) (every element lies in \([0, 7]\)).
The time complexity is \(O(n! \cdot m \cdot n)\), and the space complexity is \(O(n! \cdot n)\). Here, \(n\) is the length of the array, and \(m\) is the length of \(\textit{pre}\).