力扣 1583. 统计不开心的朋友

本文解析了如何利用二维数组和一维数组实现LeetCode题目《Count Unhappy Friends》,通过模拟好感度排名和匹配关系来计算不开心的朋友数量。核心思路是根据条件判断是否存在不开心的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目来源:https://leetcode-cn.com/problems/count-unhappy-friends/

大致题意:
给出人数(偶数),和每个人对于其他人的好感度排名(从高到低),还有总人数除2个匹配(将两个人匹配到一起)。
对于一个人x来说,有:

  • 其和 y 匹配,即(x, y)
  • y 在其好感度排名中低于 u
  • 若 u 与 v 匹配,即(u, v)
  • 而且 x 在 u 的好感度排名中高于 v

如果同时满足以上条件,则x不开心

思路

直接模拟
  1. 使用一个二维数组index[i][j]存下 i 的好感度排名中,j 所处的索引位置(即排名)
  2. 使用一维数组match[i]表示 i 匹配的人
  3. 从0至n-1遍历所有的match数组,若其满足刚刚提到的条件,则不开心人数++

代码:

public int unhappyFriends(int n, int[][] preferences, int[][] pairs) {
        int ans = 0;
        int[][] index = new int[n][n];
        // 初始化索引数组
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n-1; j++) {
                index[i][preferences[i][j]] = j;
            }
        }
        int[] match = new int[n];
        // 初始化匹配数组
        for (int[] pair : pairs) {
            int x = pair[0];
            int y = pair[1];
            match[x] = y;
            match[y] = x;
        }
        // x 与 y 匹配,找到y在x对应的preference下标idx
        // 在[0, idx)区间内所有的朋友都可能为 u
        // 找到 u 匹配的 v
        // 若index[u][x] < index[u][v],则 x 不开心
        for (int x = 0; x < n; x++) {
            // 获取匹配对象y
            int y = match[x];
            // 获取y在x的好感度排名
            int idx = index[x][y];
            // 寻找是否满足不开心条件
            for (int i = 0; i < idx; i++) {
                // 找到u
                int u = preferences[x][i];
                // 找到u匹配的v
                int v = match[u];
                // 是否满足不开心条件
                if (index[u][x] < index[u][v])
                    ans++;
                    // 本轮x已经定为不开心,不用遍历剩余对象
                    break;
            }
        }

        return ans;
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三更鬼

谢谢老板!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值