当前位置:首页 > 力扣题解 > 力扣765题:贪心算法高效解决情侣牵手问题

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

14小时前力扣题解34

贪心.jpg 力扣765题:贪心算法高效解决情侣牵手问题 力扣题解 贪心算法 C++ 第1张

一、题目解读

力扣765题"情侣牵手"描述如下:N对情侣坐在连续排列的2N个座位上,想要牵到对方的手。计算最少交换座位的次数,以便每对情侣都能并肩坐在一起。该问题考察贪心算法在实际场景中的应用,是理解位置交换类问题的经典案例。

二、解题思路

本解法采用贪心算法策略,核心思想是:

  1. 通过哈希表记录每个人的当前位置

  2. 遍历数组时,若当前情侣未配对则立即交换

  3. 每次交换确保至少完成一对情侣的匹配

  4. 交换后实时更新位置索引

这种方法保证每次交换都是当前最优选择,最终得到的交换次数即为全局最优解。

三、解题步骤

  1. 初始化位置索引:创建pos数组记录每个人(row[i])的当前位置

  2. 遍历座位数组:每次步进2个位置(i += 2)

  3. 情侣判断:计算当前人的情侣ID(x ^ 1)

  4. 交换操作

    • 若相邻不是情侣,找到情侣位置进行交换

    • 更新交换后双方的位置信息

    • 增加交换计数器

  5. 返回结果:当所有情侣配对完成时返回总交换次数

四、完整代码与注释

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++提交,是同类问题的最优解之一。

原创内容 转载请注明出处

分享给朋友:

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。