N 對情侶坐在連續排列的 2N 個座位上,想要牽到對方的手, 計算最少交換座位的次數,以便每對情侶可以并肩坐在一起, 一次交換可選擇任意兩人,讓他們站起來交換座位,
人和座位用 0 到 2N-1 的整數表示,情侶們按順序編號,第一對是 (0, 1),第二對是 (2, 3),以此類推,最后一對是 (2N-2, 2N-1),
這些情侶的初始座位 row[i] 是由最初始坐在第 i 個座位上的人決定的,
示例 1:
輸入: row = [0, 2, 1, 3]
輸出: 1
解釋: 我們只需要交換row[1]和row[2]的位置即可,
示例 2:
輸入: row = [3, 2, 0, 1]
輸出: 0
解釋: 無需交換座位,所有的情侶都已經可以手牽手了,
說明:
len(row) 是偶數且數值在 [4, 60]范圍內,
可以保證row 是序列 0...len(row)-1 的一個全排列,
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/couples-holding-hands
著作權歸領扣網路所有,商業轉載請聯系官方授權,非商業轉載請注明出處,
解題思路:
大年初三又逢情人節,LeetCode的每日一題也不甘示弱,困難難度題目看來是不想讓各位情侶出門呀,言歸正傳,要想統計最少交換座位次數,用貪心的思路可以解決,固定住偶數位數的情侶,確定奇數位數的情侶是否在期待的位置上,如果在則跳過(++2),如果不在,就找到所在位置與當前的奇數位置交換即可,代碼如下:
class Solution {
public:
int minSwapsCouples(vector<int>& row) {
int count = 0;
for(int i = 0; i < row.size(); i += 2) {
int object = find(row[i]);
// 物件不在身邊
if(row[i + 1] != object) {
int index = findIndex(object, row);
int temp = row[i + 1];
row[i + 1] = object;
row[index] = temp;
count ++;
}
}
return count;
}
// 找物件的數值
int find(int n) {
if(n % 2 == 0) {
return n + 1;
} else {
return n - 1;
}
}
// 查找索引
int findIndex(int n, vector<int>& row) {
for(int i = 0; i < row.size(); i ++) {
if(row[i] == n) {
return i;
}
}
return -1;
}
};
/*作者:heroding
鏈接:https://leetcode-cn.com/problems/couples-holding-hands/solution/czui-xiang-xi-ti-jie-by-heroding-5341/
來源:力扣(LeetCode)
著作權歸作者所有,商業轉載請聯系作者獲得授權,非商業轉載請注明出處,*/
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/259734.html
標籤:python
上一篇:Django 引入rest_framework框架并實作增刪查改
下一篇:數字配對 - [Python3]
