统计不开心的朋友

大家好,这里是Xueliang。

今天带来Leetcode的第1583题:统计不开心的朋友。这是一道中等难度的题目。

题目描述

解题思路

这道题最核心的地方在于:

  • 创建一个 的数组index_matricindex_matric[i][j]保存的是ji的朋友中亲近度排第几;这个数组可以通过preferences得到

  • 创建一个长度为n的数组matchmatch[x]=y代表xy是配对的;这个数组可以通过pairs得到

在创建好这两个数组后,算法的伪代码如下:

  • 遍历n个人

  • 对于第x人,在match数组中找到其对应的配对y=match[x]

  • 通过index_matric[x][y]找到yx的朋友中亲近度排第几,令这个值为index

  • 遍历x的朋友中所有排名比index高的的人u

  • 通过match[u]找到u的配对v;如果index_matric[u][x]<index_matric[u][v],我们就认为x是不开心的

代码实现

//C++
class Solution {
public:
    int unhappyFriends(int n, vector<vector<int>>& preferences, vector<vector<int>>& pairs) {
        vector<vector<int>> index_matric(n, vector<int>(n));
        for(int i=0; i<n;i++){
            for(int j=0; j<n-1;j++){
                index_matric[i][preferences[i][j]]=j;
            }
        }
        vector<int> match(n);
        for(auto pair: pairs){
            int person0 = pair[0];
            int person1 = pair[1];
            match[person0] = person1;
            match[person1] = person0;
        }
        int rst = 0;
        for(int x = 0; x<n; x++){
            int y = match[x];
            int index = index_matric[x][y];
            for(int i=0; i<index;i++){
                int u = preferences[x][i];
                int v = match[u];
                if(index_matric[u][x]<index_matric[u][v]){
                    rst+=1;
                    break;
                }
            }
        }
        return rst;

    }
};
##Python
class Solution:
    def unhappyFriends(self, n: int, preferences: List[List[int]], pairs: List[List[int]]) -> int:
        index_matrix = []
        for i in range(n):
            tmp = [0 for ii in range(n)]
            for j in range(n-1):
                tmp[preferences[i][j]]=j
            index_matrix.append(tmp)
        
        match = [0 for i in range(n)]
        for i in range(len(pairs)):
            person0 = pairs[i][0]
            person1 = pairs[i][1]
            match[person0] = person1
            match[person1] = person0
        
        rst = 0
        for x in range(n):
            y = match[x]
            index = index_matrix[x][y]
            for i in range(index):
                u = preferences[x][i]
                v = match[u]
                if(index_matrix[u][x]<index_matrix[u][v]):
                    rst+=1
                    break
        return rst

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值