Leetcode graphs - Day 1
Date:2025-08-02
Description:Going through graph leetcode questions for meta
Island Perimeter
// create a global count
// iterate throught the matrix
// create isValidPerimeter
// is it a 0 or undefined, its valid
// up the count
var islandPerimeter = function(grid) {
let count = 0;
for (let r = 0; r < grid.length; r++) {
for (let c = 0; c < grid[0].length; c++) {
if (grid[r][c] === 1) {
const top = grid[r - 1]?.[c];
const right = grid[r]?.[c + 1];
const bottom = grid[r + 1]?.[c];
const left = grid[r]?.[c - 1];
[top, right, bottom, left].forEach(val => {
if (val === 0 || val === undefined) {
count++;
}
});
}
}
}
return count;
};
Find Judge
/**
* @param {number} n
* @param {number[][]} trust
* @return {number}
*/
var findJudge = function(n, trust) {
//iterate through 0 .. n
// create trust adjacency list
// chech values that are not in adjList, these are possible judges
// iterate through adj List and make sure each sure everyone has the possible Candidate judge in their list
// return judge number
// else return -1
const adjList = {};
for (let i = 0; i < trust.length; i++) {
if (adjList[trust[i][0]]) {
adjList[trust[i][0]].push(trust[i][1]);
} else {
adjList[trust[i][0]] = [trust[i][1]];
}
}
if (Object.keys(adjList).length === 0) {
return -1;
}
let possibleCandidate = [];
for (let i = 1; i <= n; i++) {
if (!adjList[i]) {
possibleCandidate.push(i);
}
}
console.log(possibleCandidate, 'possibleCandidate')
let judge = -1
possibleCandidate.some(candidate => {
if (Object.values(adjList).every(trustGroup => {
return trustGroup.includes(candidate);
})) {
judge = candidate;
}
});
return judge;
};
Course Scheduler
/**
* @param {number} numCourses
* @param {number[][]} prerequisites
* @return {boolean}
*/
var canFinish = function(numCourses, prerequisites) {
const visited = new Set();
// create an adjacent list
const adjList = {};
for (const [course, preReq] of prerequisites) {
if (adjList[course]) {
adjList[course].push(preReq);
} else {
adjList[course] = [preReq];
}
}
function isPossibleToFinish(course, visiting) {
//base case
// if we've seen this in this time around return false cuz its circular now
if (visiting.has(course)) {
return false;
}
if (visited.has(course)) {
return true;
}
visiting.add(course);
console.log(adjList, course);
if (adjList[course]) {
for (let preReq of adjList[course]) {
return isPossibleToFinish(preReq, visiting);
}
}
visited.add(course);
return true;
}
let possibleToFinish = true;
for (let course = 0; course < numCourses; course++) {
// dfs search
const visiting = new Set();
if (!isPossibleToFinish(course, visiting)) {
possibleToFinish = false;
}
}
return possibleToFinish;
};