/**
* @param {number[][]} M
* @return {number}
*/
var findCircleNum = function (M) {
let count = 0
const len = M.length,
visited = new Array(len).fill(0)
const dfs = (row) => {
for (let col = 0; col < len; col++) {
const person = M[row][col]
if (person === 1 && visited[col] === 0) {
visited[col] = 1
dfs(col)
}
}
}
for (let row = 0; row < len; row++) {
if (visited[row] === 0) {
dfs(row)
count++
}
}
return count
}
//My attempt (doesn't work)
var findCircleNumFail = function (M) {
let count = 0
const len = M.length
const helper = (i, j) => {
const recurse = (i, j) => {
if (!M[i] || j >= len || j < 0) return
if (M[i][j] === 1) {
M[i][j] = 2
} else {
return
}
recurse(i, j + 1)
recurse(i, j - 1)
recurse(i + 1, j)
recurse(i + 1, j - 1)
recurse(i - 1, j)
recurse(i - 1, j + 1)
}
if (!M[i][j]) {
return 0
}
recurse(i, j)
return 1
}
for (let row = 0; row < len; row++) {
for (let col = 0; col < len; col++) {
const person = M[row][col]
if (person !== 2) {
temp = helper(row, col)
count += temp
}
}
}
return count
}
const arr1 = [
[1, 1, 0],
[1, 1, 0],
[0, 0, 1],
]
const arr2 = [
[1, 1, 0],
[1, 1, 1],
[0, 1, 1],
]
const arr3 = [
[1, 0, 0, 1],
[0, 1, 1, 0],
[0, 1, 1, 1],
[1, 0, 1, 1],
]
const arr4 = [
[1, 0, 0, 0],
[0, 1, 0, 0],
[0, 0, 1, 0],
[0, 0, 0, 1],
]
const arr5 = [
[1, 0, 0, 1, 0],
[0, 1, 1, 0, 1],
[0, 1, 1, 1, 0],
[1, 0, 1, 1, 0],
[0, 1, 0, 0, 1],
]
const arr6 = [
[1, 1, 0, 0, 0, 0],
[1, 1, 0, 0, 0, 0],
[0, 0, 1, 1, 1, 0],
[0, 0, 1, 1, 0, 0],
[0, 0, 1, 0, 1, 0],
[0, 0, 0, 0, 0, 1],
]
//Test cases
console.log(findCircleNum(arr1)) //2
console.log(findCircleNum(arr2)) //1
console.log(findCircleNum(arr3)) //1
console.log(findCircleNum(arr4)) //4
console.log(findCircleNum(arr5)) //1
console.log(findCircleNum(arr6)) //3