2Sigma OA prepare: Friends Circle

DFS & BFS:
关键在于构造graph
package twoSigma; import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Queue; public class FriendCircle1 {
ArrayList<ArrayList<Integer>> graph;
public int friendCircles(String[] friends) {
graph = new ArrayList<ArrayList<Integer>>();
for (int i=0; i<friends.length; i++) {
ArrayList<Integer> item = new ArrayList<Integer>();
for (int j=0; j<friends[0].length(); j++) {
if (i!=j && friends[i].charAt(j) == 'Y') {
item.add(j);
}
}
graph.add(new ArrayList<Integer>(item));
}
HashSet<Integer> visited = new HashSet<Integer>();
int res = 0;
for (int i=0; i<graph.size(); i++) {
if (!visited.contains(i)) {
res++;
//bfs(i, visited);
dfs(i, visited);
}
}
return res;
} public void bfs(int i, HashSet<Integer> visited) {
visited.add(i);
Queue<Integer> q = new LinkedList<Integer>();
q.offer(i);
while (!q.isEmpty()) {
int cur = q.poll();
ArrayList<Integer> curFriends = graph.get(cur);
for (int each : curFriends) {
if (!visited.contains(each)) {
visited.add(each);
q.offer(each);
}
}
}
} public void dfs(int i, HashSet<Integer> visited) {
if (visited.contains(i)) return;
visited.add(i);
ArrayList<Integer> friends = graph.get(i);
for (int friend : friends) {
dfs(friend, visited);
}
} /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
FriendCircle1 sol = new FriendCircle1();
//String[] input = new String[]{"YNYNNN", "NYNYNN", "YNYNNN", "NYNYNN", "NNNNYY", "NNNNYY"};
//String[] input = new String[]{"YYNN", "YYYN", "NYYN", "NNNY"};
//String[] input = new String[]{"YNN", "NYN", "NNY"};
String[] input = new String[]{"YYY", "YYY", "YYY"};
int count = sol.friendCircles(input);
System.out.println(count);
} }
如果想把String[] array转化为2d char array, code如下,写的时候这里出了点小问题。friends是String[]
char[][] arr = new char[friends.length][];
for (int i=0; i<friends.length; i++) {
arr[i] = friends[i].toCharArray();
}
Union Find
package twoSigma;
public class FriendCircle2 {
public int friendCircles(String[] friends) {
Unionfind uf = new Unionfind(friends.length);
for (int i=0; i<friends.length; i++) {
for (int j=0; j<friends[i].length(); j++) {
if (i != j && friends[i].charAt(j)=='Y')
uf.union(i, j);
}
}
return uf.count;
}
public class Unionfind {
int[] ids;
int count;
public Unionfind(int num) {
this.ids = new int[num];
this.count = num;
for (int i=0; i<num; i++) {
ids[i] = i;
}
}
public int findId(int i) {
return ids[i];
}
public boolean isConnected(int i1, int i2) {
return findId(i1)==findId(i2);
}
public boolean union(int i1, int i2) {
if (!isConnected(i1, i2)) {
for (int i=0; i<ids.length; i++) {
if (ids[i] == findId(i2)) {
ids[i] = findId(i1);
}
}
count--;
return true;
}
return false;
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
FriendCircle2 sol = new FriendCircle2();
String[] input = new String[]{"YNYNNN", "NYNYNN", "YNYNNN", "NYNYNN", "NNNNYY", "NNNNYY"};
//String[] input = new String[]{"YYNN", "YYYN", "NYYN", "NNNY"};
//String[] input = new String[]{"YNN", "NYN", "NNY"};
//String[] input = new String[]{"YYY", "YYY", "YYY"};
int count = sol.friendCircles(input);
System.out.println(count);
}
}
2Sigma OA prepare: Friends Circle的更多相关文章
- 2Sigma OA prepare: Longest Chain
DP use HashMap: 根据string的长度sort,然后维护每个string的longest chain,default为1,如果删除某个char生成的string能提供更长的chain, ...
- Twitter OA prepare: Two Operations
准备T家OA,网上看的面经 最直接的方法,从target降到1,如果是奇数就减一,偶数就除2 public static void main(String[] args) { int a = shor ...
- Twitter OA prepare: even sum pairs
思路:无非就是扫描一遍记录奇数和偶数各自的个数,比如为M和N,然后就是奇数里面选两个.偶数里面选两个,答案就是M(M-1)/2 + N(N-1)/2
- Twitter OA prepare: K-complementary pair
2sum的夹逼算法,需要sort一下.本身不难,但是tricky的地方在于允许同一个数组元素自己跟自己组成一个pair,比如上例中的[5, 5].而且数组本身就允许值相等的元素存在,在计算pair时, ...
- Twitter OA prepare: Anagram is A Palindrome
Algorithm: Count the number of occurrence of each character. Only one character with odd occurrence ...
- Twitter OA prepare: Visit element of the array
分析:就是建立一个boolean array来记录array里面每个元素的访问情况,遇到访问过的元素就停止visiting,返回未访问的结点个数 public int visiting(int[] A ...
- Twitter OA prepare: Rational Sum
In mathematics, a rational number is any number that can be expressed in the form of a fraction p/q ...
- Twitter OA prepare: Flipping a bit
You are given a binary array with N elements: d[0], d[1], ... d[N - 1]. You can perform AT MOST one ...
- Twitter OA prepare: Equilibrium index of an array
Equilibrium index of an array is an index such that the sum of elements at lower indexes is equal to ...
随机推荐
- fuser 命令的介绍
fuser 可以显示出当前哪个程序在使用磁盘上的某个文件.挂载点.甚至网络端口,并给出程序进程的详细信息. fuser显示使用指定文件或者文件系统的进程ID.默认情况下每个文件名后面跟一个字母表示访 ...
- Hightcharts动态创建series
第一种方法: 申明options时动态设置series,然后再创建chart对象 代码如下: <html> <head> <title>Highcharts Exa ...
- GridView合并表头、多重表头(转)
protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e) { switch (e.Row.RowType) ...
- [转]B树、B-树、B+树、B*树
题记:转一篇很直观介绍各类B树的文章. B树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right): 2.所有结点存储一个关键字: 3.非叶子结点的左指针指向小于其关键字的子树, ...
- linux 有趣的命令
input: echo ' > ..XXX. .XXX.. > .XXXXY.TXXXX. > XXXXXYXTXXXXX > .VXXVYXTVXXX. > `.TYX ...
- Maya 2015 中英文切换
我们在使用Maya软件的时候,有时候需要把语言在中英文之间切换,目前我感觉在不用插件的情况下,下面两种方法可以比较容易的做到: 方法一: 右键我的电脑属性,高级系统设置里面找到环境变量面板,然后新建一 ...
- django数据库动态添加列
方法一: python manage.py migrate 方法二: python manage.py migrate 效果: ---〉
- ie上 CSS3114: @font-face 未能完成 OpenType 嵌入权限检查。(包括图标无法显示)
转自:http://blog.csdn.net/shore_w/article/details/8976188 @font-face是CSS3中的一个模块, 它主要是把自己定义的Web字体嵌入到网页中 ...
- jquery 温故而知新 Ul 相关的操作
在UL中取得第一级的LI <div id='demo1'> <ul> <li id='1'>1<li> <li id='2'>2< ...
- 你应了解的4种JS设计模式
学习地址: http://mp.weixin.qq.com/s?__biz=MjM5MTA1MjAxMQ==&mid=2651223556&idx=1&sn=8cd7a2272 ...