顺丰面题
作者:互联网
发给朋友手撸的,在下十分佩服他,高中室友很努力没考好去了西南科技,后面保送中科大材料物理,研一郁闷一年不喜欢,跟导师说通了转到偏计算机。半小时多就完事。。。。我这个渣渣还有一年得抓紧了。
package leetcode;
/**
* @author 江河
* @date 2019-08-29 21:21
*/
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
class Solution{
public static int findCircleNum(int[][] M) {
UF uf = new UF(M.length);
for (int i = 0; i < M.length - 1; i++) {
for (int j = i + 1; j < M.length; j++) {
if (M[i][j] == 1) {
uf.union(i, j);
}
}
}
return uf.count;
}
static class UF {
public int count;
private int[] id;
private int[] sz;
public UF(int N) {
id = new int[N];
for (int i = 0; i < N; i++) {
id[i] = i;
}
sz = new int[N];
this.count = N;
}
public int find(int k) {
while (id[k] != k) {
id[k] = id[id[k]];
k = id[k];
}
return k;
}
public boolean isConnection(int m, int n) {
int p = find(m);
int q = find(n);
if (p == q) {
return true;
}
return false;
}
public void union(int m, int n) {
if (isConnection(m, n)) {
return;
}
int p = find(m);
int q = find(n);
if (sz[p] < sz[q]) {
id[p] = q;
sz[q] += sz[p];
} else {
id[q] = p;
sz[p] += sz[q];
}
count--;
}
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNext()) {
String input1Str = in.nextLine();
String[] input1 = input1Str.split(" ");
int n = Integer.parseInt(input1[0]);
int m = Integer.parseInt(input1[1]);
int k = Integer.parseInt(input1[2]);
int[][] languages = new int[k][2]; //确定已经掌握了一些语言的人
for (int i = 0; i < k; i++) {
String inputStr = in.nextLine();
String[] input = inputStr.split(" ");
languages[i][0] = Integer.parseInt(input[0]);
languages[i][1] = Integer.parseInt(input[1]);
}
Arrays.sort(languages, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return o1[1] - o2[1];
}
});
if (languages == null || languages.length == 0) {
System.out.println(n);
}
int[][] relations = new int[n][n]; //创建掌握共同语言的人的关系图
int num = languages[0][0];
int language = languages[0][1];
int l = 1;
while (l < languages.length) {
if (languages[l][1] == language) {
relations[languages[l][0] - 1][num - 1] = 1; //如果两个人掌握了相同的语言,就把关系图中对应的值设为1,表示能够直接交流
relations[num - 1][languages[l][0] - 1] = 1; //如果两个人掌握了相同的语言,就把关系图中对应的值设为1,表示能够直接交流
} else {
num = languages[l][0];
language = languages[l][1];
}
l++;
}
int isoNum = findCircleNum(relations); // 根据关系图去寻找图中能直接交流的人,并且分堆。
System.out.println(isoNum-1); //如果最后分为了n堆,那么就只需要n-1台机器就能够满足所有人之间的交流
}
}
}
标签:sz,int,面题,id,languages,new,顺丰,public 来源: https://blog.csdn.net/weixin_43958814/article/details/100147719