leetcode每日一题—1583.统计不开心的朋友

461 篇文章 1 订阅

题目:
给你一份 n 位朋友的亲近程度列表,其中 n 总是 偶数 。

对每位朋友 i,preferences[i] 包含一份 按亲近程度从高到低排列 的朋友列表。换句话说,排在列表前面的朋友与 i 的亲近程度比排在列表后面的朋友更高。每个列表中的朋友均以 0 到 n-1 之间的整数表示。

所有的朋友被分成几对,配对情况以列表 pairs 给出,其中 pairs[i] = [xi, yi] 表示 xi 与 yi 配对,且 yi 与 xi 配对。

但是,这样的配对情况可能会是其中部分朋友感到不开心。在 x 与 y 配对且 u 与 v 配对的情况下,如果同时满足下述两个条件,x 就会不开心:

x 与 u 的亲近程度胜过 x 与 y,且
u 与 x 的亲近程度胜过 u 与 v
返回 不开心的朋友的数目 。

在这里插入图片描述
解答:

class Solution:
    def unhappyFriends(self, n: int, preferences: List[List[int]], pairs: List[List[int]]) -> int:
        t=n//2
        res=0
        for i in range(t):
            for m in range(2):
                if m==0:
                    y,x=pairs[i]  
                else:
                    x,y=pairs[i]                    
                if preferences[y][0]!=x:
                    #则y可能会不开心
                    for prefer in preferences[y]:       
                        prefer_list=preferences[prefer]
                        #若prefer为x,则无需继续判断
                        if prefer==x:
                            break
                        #(y,当前朋友)比(y,x)更亲近
                        else:
                            flag=False      
                            for j in range(t):
                                #寻找当前朋友prefer的配对好友cur
                                if prefer in pairs[j]:
                                    if prefer==pairs[j][0]:
                                        cur=pairs[j][1]
                                    else:
                                        cur=pairs[j][0]
                                    #看(当前朋友,y)是否比(当前朋友,配对好友)更亲近,若是则y不开心
                                    if prefer_list.index(y)<prefer_list.index(cur):
                                        res+=1
                                        flag=True
                                    break
                        #若已判断出y不开心,则无需继续
                        if flag:
                            break
        return res

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值