LeetCode 2076. 处理含限制条件的好友请求

Posted 英雄哪里出来

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 2076. 处理含限制条件的好友请求相关的知识,希望对你有一定的参考价值。

文章目录

一、题目

1、题目描述

  给你一个整数 n n n ,表示网络上的用户数目。每个用户按从 0 0 0 n − 1 n - 1 n1 进行编号。
  给你一个下标从 0 0 0 开始的二维整数数组 restrictions,其中 restrictions[i] = [xi, yi]意味着用户 xi和用户 yi不能 成为 朋友 ,不管是 直接 还是通过其他用户 间接 。
  最初,用户里没有人是其他用户的朋友。给你一个下标从 0 0 0 开始的二维整数数组 requests表示好友请求的列表,其中 requests[j] = [uj, vj]是用户 uj和用户 vj之间的一条好友请求。
  如果 ujvj可以成为 朋友 ,那么好友请求将会 成功 。每个好友请求都会按列表中给出的顺序进行处理(即,requests[j]会在 requests[j + 1]前)。一旦请求成功,那么对所有未来的好友请求而言, ujvj将会 成为直接朋友 。
  返回一个 布尔数组 result,其中元素遵循此规则:如果第 j个好友请求 成功 ,那么 result[j]就是 true;否则,为 false
  注意:如果 ujvj已经是直接朋友,那么他们之间的请求将仍然 成功 。
  样例输入: n = 3, restrictions = [[0,1]], requests = [[0,2],[2,1]]
  样例输出: [true,false]

2、基础框架

  • C++ 版本给出的基础框架代码如下:
class Solution 
public:
    vector<bool> friendRequests(int n, vector<vector<int>>& restrictions, vector<vector<int>>& requests) 
        
    
;

3、原题链接

LeetCode 2076. 处理含限制条件的好友请求

二、解题报告

1、思路分析

   ( 1 ) (1) (1) 把整件事情拆解开来:
     ( 1.1 ) (1.1) (1.1) restrictions[i] = [xi, yi]表示这两人不能在一个集合中。我们叫它 黑名单
     ( 1.2 ) (1.2) (1.2) requests[j] = [uj, vj]询问这两个人在不在一个集合中。如果在一个集合中,返回true;如果不在一个集合中,分两种情况:能建立连接 和 不能建立连接。
   ( 2 ) (2) (2) 如果对于两个不在集合中的人,建立连接以后,导致这两个集合里面的人存在于 restrictions[i]中,则这两个人无法建立连接。
   ( 3 ) (3) (3) 再来捋一下思路:一开始是一些的孤立的点,询问是否是好友,可以采用并查集 O ( 1 ) O(1) O(1) 判断。如果是好友,返回true,不改数据;如果不是好友,则遍历其中一个集合中的所有人的restrictions,查找它所有的黑名单,是不是在另一个集合中,如果都没有,则能够进行合并;否则不能。

不是 在黑名单 不在黑名单 并查集判断是否是好友 返回true 遍历所有黑名单 返回false 执行并查集的合并

2、时间复杂度

   最坏时间复杂度 O ( n 2 ) − O ( n 3 ) O(n^2) - O(n^3) O(n2)O(n3)

3、代码详解


class Solution 
    #define maxn 1010

    int f[maxn];
    vector<int> blacklist[maxn];
    bool hash[maxn];

    void init(int n) 
        for(int i = 0; i < n; ++i) 
            f[i] = i;
        
    

    void unionset_union(int x, int y) 
        int fx = unionset_find(x);
        int fy = unionset_find(y);
        f[fx] = fy;
    

    int unionset_find(int x) 
        return f[x] == x ? x : ( f[x] = unionset_find(f[x]) );
    

public:
    vector<bool> friendRequests(int n, vector<vector<int>>& restrictions, vector<vector<int>>& requests) 
        vector<bool> responses;
        int i, j, k;
        init(n);
        for(i = 0; i < n; ++i) 
            blacklist[i].clear();
        
        for(i = 0; i < restrictions.size(); ++i) 
            int u = restrictions[i][0];
            int v = restrictions[i][1];
            blacklist[u].push_back(v);
            blacklist[v].push_back(u);
        
        for(i = 0; i < requests.size(); ++i) 
            int u = requests[i][0];
            int v = requests[i][1];
            int uroot = unionset_find(u);
            int vroot = unionset_find(v);
            if(uroot == vroot) 
                responses.push_back(true);
            else 
                memset(hash, 0, sizeof(hash));
                for(j = 0; j < n; ++j) 
                    if( vroot == unionset_find(j) ) 
                        hash[j] = 1;
                    
                
                bool flag = 0;

                for(j = 0; j < n; ++j) 
                    if( uroot != unionset_find(j) ) 
                        continue;
                    
                    
                    for(k = 0; k < blacklist[j].size(); ++k) 
                        int black = blacklist[j][k];
                        if(hash[black]) 
                            flag = 1;
                            break;
                        
                    
                    if(flag) 
                        break;
                    
                

                if(flag) 
                    responses.push_back(false);
                else 
                    unionset_union(u, v);
                    responses.push_back(true);
                
            
        
        return responses;
    
;













三、本题小知识

  当一个问题想不清楚的时候,我们把它的整个流程图画出来,因为程序就是流程流程清晰了以后再把它翻译成代码,就会非常愉悦,以及酣畅淋漓,过啦!


四、加群须知

  相信看我文章的大多数都是「 大学生 」,能上大学的都是「 精英 」,那么我们自然要「 精益求精 」,如果你还是「 大一 」,那么太好了,你拥有大把时间,当然你可以选择「 刷剧 」,然而,「 学好算法 」,三年后的你自然「 不能同日而语 」
  那么这里,我整理了「 几十个基础算法 」 的分类,点击开启:

🌌《算法入门指引》🌌

  如果链接被屏蔽,或者有权限问题,可以私聊作者解决。

  大致题集一览:













  为了让这件事情变得有趣,以及「 照顾初学者 」,目前题目只开放最简单的算法 「 枚举系列 」 (包括:线性枚举、双指针、前缀和、二分枚举、三分枚举),当有 一半成员刷完 「 枚举系列 」 的所有题以后,会开放下个章节,等这套题全部刷完,你还在群里,那么你就会成为「 夜深人静写算法 」专家团 的一员。
  不要小看这个专家团,三年之后,你将会是别人 望尘莫及 的存在。如果要加入,可以联系我,考虑到大家都是学生, 没有「 主要经济来源 」,在你成为神的路上,「 不会索取任何 」
  🔥联系作者,或者扫作者主页二维码加群,加入刷题行列吧🔥


🔥让天下没有难学的算法🔥

C语言免费动漫教程,和我一起打卡!
🌞《光天化日学C语言》🌞

让你养成九天持续刷题的习惯
🔥《九日集训》🔥

入门级C语言真题汇总
🧡《C语言入门100例》🧡

组团学习,抱团生长
🌌《算法零基础100讲》🌌

几张动图学会一种数据结构
🌳《画解数据结构》🌳

竞赛选手金典图文教程
💜《夜深人静写算法》💜

以上是关于LeetCode 2076. 处理含限制条件的好友请求的主要内容,如果未能解决你的问题,请参考以下文章

BBO三维路径规划基于matlab生物地理学算法无人机三维路径规划含Matlab源码 2076期

hdu 4255 含限制条件的广搜

LeetCode 0309. 最佳买卖股票时机含冷冻期

LeetCode:Database 26.好友申请 II :谁有最多的好友

LeetCode(数据库)- 好友申请II:谁有最多的好友

微信老是出现“该微信号使用外挂,非官方客户端和模拟器,以限制登录”是啥意思?