dfs图的连通分量
// dfs
class Solution {
//图的连通分量
boolean[] visit;
public int mainDfs(int[][] M) {
int n = M.length;
if(n <= 0) return 0;
visit = new boolean[n];
int cnt = 0;
for(int i = 0;i < n;i++){
if(!visit[i]){
dfs(M,i);
cnt++;
}
}
return cnt;
}
private void dfs(int[][] M,int i){
visit[i] = true;
for(int j = 0;j < M.length;j++){
if(!visit[j] && M[i][j] == 1)
dfs(M,j);
}
}
}
dfs非图关系,而是水平垂直方向连通
class Solution {
boolean[][] visit;
int[] dx = {0,-1,0,1},dy = {-1,0,1,0};
int cnt = 0;
public int maindfs(char[][] grid) {
if(grid == null || grid.length==0 || grid[0].length==0) return 0;
visit = new boolean[grid.length][grid[0].length];
for(int i = 0;i < grid.length;i++){
for(int j = 0;j < grid[0].length;j++){
if(!visit[i][j] && grid[i][j] == '1'){
cnt++;
dfs(grid,i,j);
}
}
}
return cnt;
}
private void dfs(char[][] grid,int i,int j ){
//if(i < 0 || i >= grid.length || j < 0 || j >= grid[0].length) return;
visit[i][j] = true;
for(int k = 0;k < 4;k++){
int newI = i + dx[k],newJ = j + dy[k];
if(isValid(grid,newI,newJ) && !visit[newI][newJ]) dfs(grid,newI,newJ);
}
}
private boolean isValid(char[][] grid,int i,int j){
if(i < 0 || i >= grid.length || j < 0 || j >= grid[0].length || grid[i][j] == '0')
return false;
return true;
}
}
bfs
//入参简写,为图,源节点以及v为处理你的需求
public void bfs(Graph,s,v){
v(s);
visited[s] = true; //记录是否访问过
q.add(s);
while(queue非空){
v = q.poll();
for(i:v的临边){
if(!visited[i]){
visited[i] = true;
visit(i);
q.add(i);
}
}
}
}
UnionFind
class UnionFind{
public int[] parent;
public UnionFind(int n){
parent = new int[n];
//数组初始化
for(int i = 0;i < n;i++)
parent[i] = i;
}
public void union(int i,int j){
i = find(i);
j = find(j);
//一下根据你的需求,谁连接谁
if(i < j) parent[j] = i;
else parent[i] = j;
}
public int find(int x){
while(x != parent[x]) x = parent[x];
return x;
}
}
public List<Integer> findAnagrams(String s, String p) {
Map<Character,Integer> map = new HashMap<>();
for(char c: p.toCharArray()) map.put(c,map.getOrDefault(c,0)+1);//初始化map
int cnt = map.size();
int begin = 0,end = 0;
ArrayList<Integer> res = new ArrayList<>();
while(end < s.length()){
char c = s.charAt(end);
if(map.get(c) != null){ //减计数
map.put(c,map.get(c) - 1);
if(map.get(c) == 0) cnt--;
}
end++;
while(cnt == 0){
if(end - begin == p.length()) //处理结果
res.add(begin);
char tmp = s.charAt(begin);
if(map.get(tmp) != null){ //加计数
map.put(tmp,map.get(tmp)+1);
if(map.get(tmp) > 0) cnt++;
}
begin++;
}
}
return res;
}