2Sigma OA prepare: Friends Circle

DFS & BFS:

关键在于构造graph

 1 package twoSigma;
 2 
 3 import java.util.ArrayList;
 4 import java.util.HashSet;
 5 import java.util.LinkedList;
 6 import java.util.Queue;
 7 
 8 public class FriendCircle1 {
 9     ArrayList<ArrayList<Integer>> graph;
10     public int friendCircles(String[] friends) {
11         graph = new ArrayList<ArrayList<Integer>>();
12         for (int i=0; i<friends.length; i++) {
13             ArrayList<Integer> item = new ArrayList<Integer>();
14             for (int j=0; j<friends[0].length(); j++) {
15                 if (i!=j && friends[i].charAt(j) == 'Y') {
16                     item.add(j);
17                 }
18             }
19             graph.add(new ArrayList<Integer>(item));
20         }
21         HashSet<Integer> visited = new HashSet<Integer>();
22         int res = 0;
23         for (int i=0; i<graph.size(); i++) {
24             if (!visited.contains(i)) {
25                 res++;
26                 //bfs(i, visited);
27                 dfs(i, visited);
28             }
29         }
30         return res;
31     }
32     
33     public void bfs(int i, HashSet<Integer> visited) {
34         visited.add(i);
35         Queue<Integer> q = new LinkedList<Integer>();
36         q.offer(i);
37         while (!q.isEmpty()) {
38             int cur = q.poll();
39             ArrayList<Integer> curFriends = graph.get(cur);
40             for (int each : curFriends) {
41                 if (!visited.contains(each)) {
42                     visited.add(each);
43                     q.offer(each);
44                 }
45             }
46         }
47     }
48     
49     public void dfs(int i, HashSet<Integer> visited) {
50         if (visited.contains(i)) return;
51         visited.add(i);
52         ArrayList<Integer> friends = graph.get(i);
53         for (int friend : friends) {
54             dfs(friend, visited);
55         }
56     }
57 
58     /**
59      * @param args
60      */
61     public static void main(String[] args) {
62         // TODO Auto-generated method stub
63         FriendCircle1 sol = new FriendCircle1();
64         //String[] input = new String[]{"YNYNNN", "NYNYNN", "YNYNNN", "NYNYNN", "NNNNYY", "NNNNYY"};
65         //String[] input = new String[]{"YYNN", "YYYN", "NYYN", "NNNY"};
66         //String[] input = new String[]{"YNN", "NYN", "NNY"};
67         String[] input = new String[]{"YYY", "YYY", "YYY"};
68         int count = sol.friendCircles(input);
69         System.out.println(count);
70     }
71 
72 }

如果想把String[] array转化为2d char array, code如下,写的时候这里出了点小问题。friends是String[]

1         char[][] arr = new char[friends.length][];
2         for (int i=0; i<friends.length; i++) {
3             arr[i] = friends[i].toCharArray();
4         }

Union Find

 1 package twoSigma;
 2 
 3 public class FriendCircle2 {
 4     public int friendCircles(String[] friends) {
 5         Unionfind uf = new Unionfind(friends.length);
 6         for (int i=0; i<friends.length; i++) {
 7             for (int j=0; j<friends[i].length(); j++) {
 8                 if (i != j && friends[i].charAt(j)=='Y')
 9                     uf.union(i, j);
10             }
11         }
12         return uf.count;
13     }
14     
15     public class Unionfind {
16         int[] ids;
17         int count;
18         public Unionfind(int num) {
19             this.ids = new int[num];
20             this.count = num;
21             for (int i=0; i<num; i++) {
22                 ids[i] = i;
23             }
24         }
25         
26         public int findId(int i) {
27             return ids[i];
28         }
29         
30         public boolean isConnected(int i1, int i2) {
31             return findId(i1)==findId(i2);
32         }
33         
34         public boolean union(int i1, int i2) {
35             if (!isConnected(i1, i2)) {
36                 for (int i=0; i<ids.length; i++) {
37                     if (ids[i] == findId(i2)) {
38                         ids[i] = findId(i1);
39                     }
40                 }
41                 count--;
42                 return true;
43             }
44             return false;
45         }
46     }
47 
48     /**
49      * @param args
50      */
51     public static void main(String[] args) {
52         // TODO Auto-generated method stub
53         FriendCircle2 sol = new FriendCircle2();
54         String[] input = new String[]{"YNYNNN", "NYNYNN", "YNYNNN", "NYNYNN", "NNNNYY", "NNNNYY"};
55         //String[] input = new String[]{"YYNN", "YYYN", "NYYN", "NNNY"};
56         //String[] input = new String[]{"YNN", "NYN", "NNY"};
57         //String[] input = new String[]{"YYY", "YYY", "YYY"};
58         int count = sol.friendCircles(input);
59         System.out.println(count);
60     }
61 
62 }
原文地址:https://www.cnblogs.com/EdwardLiu/p/6177825.html