LeetCode65 有效的数字
/**
* @param {string} s
* @return {boolean}
*/
var isNumber = function(s) {
// 构建图
const graph = {
0: {'blank': 0, 'sign': 1, '.': 2, 'digit': 6},
1: {'digit': 6, '.': 2},
2: {'digit': 3},
3: {'digit': 3, 'e': 4},
4: {'digit': 5, 'sign': 7},
5: {'digit': 5},
6: {'digit': 6, '.': 3, 'e': 4},
7: {'digit': 5}
}
let state = 0;
for(let c of s.trim()){
if(c >= '0' && c <= '9'){
c = 'digit';
}else if(c === ''){
c = 'blank';
}else if(c === '+' || c === '-'){
c = 'sign';
}else if(c === 'e' || c === 'E'){
c = 'e';
}
state = graph[state][c]; // 更新状态
if(state === undefined) {
return false;
}
}
if(state === 3 || state === 5 || state === 6){
return true;
}
return false;
};
LeetCode417. 太平洋大西洋水流问题
/**
* @param {number[][]} heights
* @return {number[][]}
*/
var pacificAtlantic = function(matrix) {
if(!matrix || !matrix[0]) return [];
const m = matrix.length;
const n = matrix[0].length;
const flow1 = new Array(m).fill(0).map(() => Array(n).fill(false));
const flow2 = new Array(m).fill(0).map(() => Array(n).fill(false));
const dfs = (r, c, flow) => {
flow[r][c] = true;
[[r-1, c], [r+1, c], [r, c-1], [r, c+1]].forEach(([nr,nc]) => {
if(
nr >= 0 && nr < m &&
nc >= 0 && nc < n &&
// 防止死循环
!flow[nr][nc] &&
matrix[nr][nc] >= matrix[r][c]
){
dfs(nr, nc, flow);
}
})
};
// 沿着海岸线逆流而上
for(let r = 0; r < m; r ++){
dfs(r, 0, flow1);
dfs(r, n - 1, flow2);
}
for(let c = 0; c < n; c ++){
dfs(0, c, flow1);
dfs(m-1, c, flow2);
}
//可以留到两个大洋的坐标
const res = [];
for(let r = 0; r < m; r ++){
for(let c = 0; c < n; c ++){
if(flow1[r][c] && flow2[r][c]){
res.push([r,c]);
}
}
};
return res;
};
LeetCode138 克隆图
DFS 深度优先遍历
/**
* // Definition for a Node.
* function Node(val, neighbors) {
* this.val = val === undefined ? 0 : val;
* this.neighbors = neighbors === undefined ? [] : neighbors;
* };
*/
/**
* @param {Node} node
* @return {Node}
*/
var cloneGraph = function(node) {
if(!node) return;
const visited = new Map();
const dfs = (n) => {
// console.log(n.val);
const nCopy = new Node(n.val);
visited.set(n, nCopy);
(n.neighbors || []).forEach(ne => {
if(!visited.has(ne)){
dfs(ne);
}
nCopy.neighbors.push(visited.get(ne));
})
};
dfs(node);
return visited.get(node);
};
BFS
/**
* // Definition for a Node.
* function Node(val, neighbors) {
* this.val = val === undefined ? 0 : val;
* this.neighbors = neighbors === undefined ? [] : neighbors;
* };
*/
/**
* @param {Node} node
* @return {Node}
*/
var cloneGraph = function(node) {
if(!node) return;
const visited = new Map();
visited.set(node, new Node(node.val));
const q = [node];
while(q.length){
const n = q.shift();
// console.log(n.val);
(n.neighbors || []).forEach(ne => {
if(!visited.has(ne)){
q.push(ne);
visited.set(ne, new Node(ne.val));
}
visited.get(n).neighbors.push(visited.get(ne));
})
};
return visited.get(node);
};