leetcode1583统计不开心的朋友

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
思路

  1. 所有的朋友都配对了,没有剩下的,所以用的数组都是满的。
  2. 整理题目不开心的要求是对于配对的(x,y)(u,v) : (x,u)>(x,y) and (u,x)>(u,v)也就是ux的好感度序号比y小,这样才可能找到u,而对于ux的好感度序号要小于v
  3. 分析根据序号有关,那么match[x]=y;order[x][y] = k;一个是配对的序号,一个是yx处的好感度排名,而preference[x][k] = y

代码

#include<stdio.h>
#include<string.h>
int unhappyFriends(int n, int** preferences, int preferencesSize, int* preferencesColSize, int** pairs, int pairsSize, int* pairsColSize){
    int i=0,j=0;
    int match[pairsSize];
    memset(match,-1,sizeof(match));
    for(i=0;i<pairsSize;i++){
        match[*((int*)pairs+i*(*pairsColSize)+0)] = *((int*)pairs+i*(*pairsColSize)+1); 
        match[*((int*)pairs+i*(*pairsColSize)+1)] = *((int*)pairs+i*(*pairsColSize)+0);
    }
    int order[n][n];
    memset(order,-1,sizeof(order));
    for(i=0;i<preferencesSize;i++){
        for(j=0;j<*preferencesColSize;j++){
            order[i][*((int*)preferences+i*(*preferencesColSize)+j)] = j; 
        }
    }

    int unhappy = 0;

    int x,y,u,v;
    for(x=0;x<n;x++){
        y = match[x];
        int index = order[x][y];
        for(i=0;i<=index;i++){//序号排在y之前的都可能是u
            u = preferences[x][i];
            v = match[u];//对于其配对的v
            if(order[u][x]<order[u][v]){//好感度序号排位x在v之前
                unhappy++;
                break;
            }
        }
    }

    return unhappy;
    
}

leetcode代码

int unhappyFriends(int n, int** preferences, int preferencesSize, int* preferencesColSize, int** pairs, int pairsSize, int* pairsColSize){
  int i=0,j=0;
    int match[n];
    memset(match,-1,sizeof(match));
    for(i=0;i<pairsSize;i++){
        match[pairs[i][0]] = pairs[i][1]; 
        match[pairs[i][1]] = pairs[i][0];
    }
    int order[n][n];
    memset(order,-1,sizeof(order));
    for(i=0;i<preferencesSize;i++){
        for(j=0;j<*preferencesColSize;j++){
            order[i][preferences[i][j]] = j; 
        }
    }

    int unhappy = 0;

    int x,y,u,v;
    for(x=0;x<n;x++){
        y = match[x];
        int index = order[x][y];
        for(i=0;i<=index;i++){
            u = preferences[x][i];
            v = match[u];
            if(order[u][x]<order[u][v]){
                unhappy++;
                break;
            }
        }
    }

    return unhappy;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值