力扣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++提交,是同类问题的最优解之一。
原创内容 转载请注明出处