力扣765题:贪心算法高效解决情侣牵手问题

一、题目解读
力扣765题"情侣牵手"描述如下:N对情侣坐在连续排列的2N个座位上,想要牵到对方的手。计算最少交换座位的次数,以便每对情侣都能并肩坐在一起。该问题考察贪心算法在实际场景中的应用,是理解位置交换类问题的经典案例。
二、解题思路
这种方法保证每次交换都是当前最优选择,最终得到的交换次数即为全局最优解。
三、解题步骤
初始化位置索引:创建pos数组记录每个人(row[i])的当前位置
遍历座位数组:每次步进2个位置(i += 2)
情侣判断:计算当前人的情侣ID(x ^ 1)
交换操作:
若相邻不是情侣,找到情侣位置进行交换
更新交换后双方的位置信息
增加交换计数器
返回结果:当所有情侣配对完成时返回总交换次数
四、完整代码与注释
class Solution {
public:
int minSwapsCouples(vector<int>& row) {
int n = row.size();
vector<int> pos(n); // 记录每个人的位置
for (int i = 0; i < n; ++i) {
pos[row[i]] = i;
}
int res = 0;
for (int i = 0; i < n; i += 2) {
int x = row[i];
int y = x ^ 1; // 计算x的情侣ID
if (row[i + 1] == y) continue; // 已经配对
// 交换位置
int j = pos[y];
swap(row[i + 1], row[j]);
pos[row[j]] = j; // 更新位置信息
pos[row[i + 1]] = i + 1;
res++;
}
return res;
}
};五、总结
本文详细解析了力扣765题的贪心算法解法,时间复杂度为O(N),空间复杂度O(N)。关键在于利用位运算快速匹配情侣对,并通过位置哈希表优化查找效率。该解法在LeetCode上击败了100%的C++提交,是同类问题的最优解之一。
原创内容 转载请注明出处
