The people and seats are represented by an integer from 0 to 2N-1, the couples are numbered in order, the first couple being (0, 1), the second couple being (2, 3), and so on with the last couple being (2N-2, 2N-1).
The couples' initial seating is given by row[i] being the value of the person who is initially sitting in the i-th seat.
Example 1:
Input: row = [0, 2, 1, 3]
Output: 1
Explanation: We only need to swap the second (row[1]) and third (row[2]) person.
Example 2:
Input: row = [3, 2, 0, 1]
Output: 0
Explanation: All couples are already seated side by side.
Note:
len(row) is even and in the range of [4, 60].
row is guaranteed to be a permutation of 0...len(row)-1.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Solution { | |
/** | |
* @param row | |
* @return | |
*/ | |
public int minSwapsCouples(int[] row) { | |
// filter abnormal cases | |
if (row == null || row.length == 0) { | |
return 0; | |
} | |
// core logic | |
int swapCounter = 0; | |
HashMap<Integer, Integer> lookup = new HashMap<>(); | |
for (int i = 0; i < row.length; i++) { | |
lookup.put(row[i], i); | |
} | |
for (int i = 0; i < row.length; i += 2) { | |
if (!isPair(row[i], row[i + 1])) { | |
swap(row, i + 1, lookup.get(getPartner(row[i])), lookup); | |
swapCounter++; | |
} | |
} | |
// return the final result | |
return swapCounter; | |
} | |
private int getPartner(int i) { | |
if (i % 2 == 0) { | |
return i + 1; | |
} else { | |
return i - 1; | |
} | |
} | |
private void swap(int[] row, int i, int j, HashMap<Integer, Integer> lookup) { | |
int tmp = row[i]; | |
lookup.put(row[i], j); | |
lookup.put(row[j], i); | |
row[i] = row[j]; | |
row[j] = tmp; | |
} | |
private boolean isPair(int a, int b) { | |
return a / 2 == b / 2; | |
} | |
} |
No comments:
Post a Comment