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