Description
We have two integer sequences A and B of the same non-zero length.
We are allowed to swap elements A[i] and B[i]. Note that both elements are in the same index position in their respective sequences.
At the end of some number of swaps, A and B are both strictly increasing. (A sequence is strictly increasing if and only if A[0] < A[1] < A[2] < … < A[A.length - 1].)
Given A and B, return the minimum number of swaps to make both sequences strictly increasing. It is guaranteed that the given input always makes it possible.
Example
1 | Input: A = [1,3,5,4], B = [1,2,3,7] |
Note:
- A, B are arrays with the same length, and that length will be in the range [1, 1000].
- A[i], B[i] are integer values in the range [0, 2000].
Solution
swap[n] means the minimum swaps to make the A[i] and B[i] sequences increasing for 0 <= i <= n in condition that we swap A[n] and B[n]
not_swap[n] is the same with A[n] and B[n] not swapped.
A[i - 1] < A[i] && B[i - 1] < B[i]. In this case, if we want to keep A and B increasing before the index i, can only have two choices.
-> 1.1 don’t swap at (i-1) and don’t swap at i, we can get not_swap[i] = not_swap[i-1]
-> 1.2 swap at (i-1) and swap at i, we can get swap[i] = swap[i-1]+1
if swap at (i-1) and do not swap at i, we can not guarantee A and B increasing.A[i-1] < B[i] && B[i-1] < A[i]. In this case, if we want to keep A and B increasing before the index i, can only have two choices.
-> 2.1 swap at (i-1) and do not swap at i, we can get notswap[i] = Math.min(swap[i-1], notswap[i] )
-> 2.2 do not swap at (i-1) and swap at i, we can get swap[i]=Math.min(notswap[i-1]+1, swap[i])1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24class Solution {
public int minSwap(int[] A, int[] B) {
int[] swap = new int[A.length];
int[] not_swap = new int[B.length];
swap[0] = 1;
for (int i = 1; i < A.length; i++){
swap[i] = Integer.MAX_VALUE;
not_swap[i] = Integer.MAX_VALUE;
}
for (int i = 1; i < A.length; i++){
if (A[i - 1] < A[i] && B[i - 1] < B[i]){
not_swap[i] = not_swap[i - 1];
swap[i] = swap[i - 1] + 1;
}
if (A[i - 1] < B[i] && B[i - 1] < A[i]){
not_swap[i] = Math.min(not_swap[i], swap[i - 1]);
swap[i] = Math.min(swap[i], not_swap[i - 1] + 1);
}
}
return Math.min(swap[A.length - 1], not_swap[A.length - 1]);
}
}