首页 > 编程知识 正文

微软经典面试题(leetcode题解)

时间:2023-05-05 04:58:16 阅读:68128 作者:646

微软面试问题:可能的二分法描述

给定一组n人(编号1,2,…,n ),我们想把每个人分成任意大小的两组。

因为每个人可能都不喜欢别人,所以他们不应该属于同一组。

形式上,dislikes[i]=[a,b]表示不允许将编号为a和b的人放在同一组中。

当用这种方法可以将每个人分成两组时,返回true; 否则我要回false。

1=N=2000

0=dislikes.length=10000

1=dislikes[i][j]=N

dislikes[i][0] dislikes[i][1]

dislikes[i]==dislikes[j]中不存在I!=j

在线评估地址样例1

输入: N=4,dislikes=[ 1,2 ]、[ 1,3 ]、[ 2,4 ]输出: true解释: group1[ 1,4 ]、group2[ 2,3 ] http://www.Sina .

输入: N=3,dislikes=[ 1,2 ]、[ 1,3 ]、[ 2,3 ]输出: false 样例 2

输入: N=5,dislikes=[ 1,2 ]、[ 2,3 ]、[ 3,4 ]、[ 4,5 ]、[ 1,5 ]输出: false 样例 3

首先根据讨厌的关系,制作无向图。 遍历每个节点,如果尚未放置节点,默认情况下将其放在第一个类中,然后搜索该节点的相邻节点,将所有未放置的相邻节点放在其他类中,然后搜索这些节点。 如果相邻节点已经存在,则确定其是否在另一个类中;如果没有,则返回false,如果存在,则继续搜索。 如果遍历所有节点并不冲突,则返回true。解题思路

class solution : ' ' @ paramn : sumoftheset @ param dislikes 3360 dislikes peoples @ return 3360 ifitispossibletospliteveryovery ition(self,n,dislikes ) : # writeyourcodehere.visited=[0foriinrange ] n ] adj=[ ] foriinrange (n ); fordisindislikes 3360 adj [ dis [0]-1 ].append [ dis [1]-1 ]; adj[dis[1]-1].append(dis[0]-1; forIinrange(0,n ) : if visited [ I ]==0: visited [ I ]=1; ifnotself.DFS(I,visited,adj ) :返回假; 返回真; defDFS(self,cur,visited,adj ) : forjinadj [ cur ] : if visited [ j ]==03360 visited [ j ]=-visited [ cur ] id elif可见性[ j ]==可见性[ cur ] :返回假; 返回真; 其他问题解决参考

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。