トピックリンク:
タイトル説明
座席に座っNのカップルは、連続的に2Nを配置し、互いの手を引きたいです。各カップルが並んで座ることができるように、スイッチの座席数の最小値を計算します。交換は、任意の2人を選ぶ彼らが立ち上がって席を切り替えることができますすることができます。
そしてシートは、0から2N-1までの整数で表され、番号順次結合する第一の対は(0,1)と、第2の対は、(2,3)など、最後のペアは(2N-です2、2N-1)。
これらの初期席のカップル行[i]はi番目の席に座っ決定最も独創的な人です。
例1:
输入: row = [0, 2, 1, 3]
输出: 1
解释: 我们只需要交换row[1]和row[2]的位置即可。
例2:
输入: row = [3, 2, 0, 1]
输出: 0
解释: 无需交换座位,所有的情侣都已经可以手牵手了。
説明:
- LEN(行)と偶数値[4、60]の範囲です。
- シーケンスは、行0 ... LEN(行)-1フル順列を保証することができます。
考え
1つのダイレクト検索
/*
* 直接查找
* 时间复杂度O(N^2) 空间复杂度O(1)
*/
class Solution {
public:
int minSwapsCouples(vector<int>& row) {
int ret = 0;
for (int i = 0; i < row.size(); i+=2) {
int next = row[i] ^ 1; // 对应的情侣编号
if(row[i+1] == next) continue;
for (int j = i+2; j < row.size(); ++j) {
if(row[j] == next){
++ret;
swap(row[j], row[i+1]);
break;
}
}
}
return ret;
}
};
複雑分析
時間複雑:O(N ^ 2)
複雑容量:O(1)
2ハッシュマップ
複雑分析
時間複雑:O(n)の
空間の複雑さ:O(N)
class Solution {
public:
int minSwapsCouples(vector<int>& row) {
unordered_map<int,int> index;
int ret = 0;
for (int i = 0; i < row.size(); ++i)
index[row[i]] = i; // 记录位置
for (int i = 0; i < row.size(); i+=2) {
int next = row[i] ^ 1; // 对应的情侣编号
if(row[i+1] == next)
continue;
swap(row[index[next]], row[i+1]); // 交换数组
swap(index[row[index[next]]], index[row[i+1]]); // 交换坐标
++ ret;
}
return ret;
}
};