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 ...
随机推荐
- js小效果-简易计算器
<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8" ...
- Poj 3250 单调栈
1.Poj 3250 Bad Hair Day 2.链接:http://poj.org/problem?id=3250 3.总结:单调栈 题意:n头牛,当i>j,j在i的右边并且i与j之间的所 ...
- App所需申请资料
准备资料 企业五证 营业执照 税务登记证 组织机构代码证 银行开户许可证 法人身份证 新邮箱 申请一个新的邮箱地址,供申请以下材料使用 苹果证书申请 AppleID 申请邓氏编码需要有AppleID ...
- Mybatis一级、二级缓存
Mybatis一级.二级缓存 一级缓存 首先做一个测试,创建一个mapper配置文件和mapper接口,我这里用了最简单的查询来演示. <mapper namespace="c ...
- 如何在Linux中使用rz/sz工具进行文件传输
在Linux中,使用rz/sz工具能够进行Linux和windows之间的文件传输,那么要如何使用rz/sz工具工具呢?下面小编就给大家介绍下Linux下如何使用rz/sz工具进行文件传输,一起来学习 ...
- nginx资源定向 css js路径问题
今天玩玩项目,学学nginx发现还不错,速度还可以,但是CSS JS确无法使用,原来Iginx配置时需要对不同类型的文件配置规则,真是很郁闷,不过想想也还是很有道理.闲暇之际,把配置贴上来.#user ...
- CSS3两个动画顺序衔接播放
问题描述: 第一个动画先播放,播放完成后,第二个动画紧接着播放. 解决办法: 1. 将第二个的延迟时间(animation-delay) 设置成第一个的持续时间( animation-duration ...
- 在MySql 5.0 的表里同时添加两个自动更新的timestamp字段
create table user_info (user_id int primary key auto_increment, register_time timestamp not null DEF ...
- android-Activity(四大组件之一)
一.Activity理解 1.定义: 直译为活动,是Android定义四大应用组件之一,也是最重要的用的最多的: 用来提供一个能让用户操作并与之交互的界面 一个应用有多个界面也就是包含多个Activi ...
- ThinkPHP留后门技巧
原文链接:https://www.leavesongs.com/PENETRATION/thinkphp-callback-backdoor.html 90sec上有人问,我说了还有小白不会用.去年我 ...