67 阅读1分钟

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);
 
};