常用算法模板(一)

二分查找

适用场景:

  • 有序表中;
  • 可经排序后形成有序表。
    // 二分法查找target
    const binarySearch = (arr, target) => {
        // 左闭右开区间
        let left = 0;
        let right = arr.length;
    
        while (left < right) {
            let mid = left + Math.floor((right - left) / 2);
            // 注意写正确if条件中的语句,满足条件的mid值放入左区间
            if (arr[mid] < target) {
                left = mid + 1;
            }
            else {
                right = mid;
            }
        }
    
        // 此时left,right相等,位于右区间的最左边
        // 如果不确定target值是否存在,则最后返回前比较一下arr[left]与target值是否相等
        return left;
    }

BFS

适用场景:

  • 遍历树、图时;
  • 求某个“最少/短值”时(最短路径问题);
  • 树的层序遍历。
    // 递归实现略
    
    // 遍历图,寻找到target的最短路径,迭代实现
    const bfs = (root, target) => {
        const queue = [root];
        // 图中存在环时,需要申请哈希集记录遍历过的节点,以免节点重复入队造成死循环
        const set = new Set(root);
        // 最短路径问题需要返回步长
        let step = -1;
    
        while (queue.length) {
            ++step;
            const size = queue.length;
            for (i = 0; i < size; ++i) {
                // 队首节点出队
                const cur = queue.shift();
                if (cur === target) {
                    return step;
                }
                // 遍历当前节点的下一层节点
                for (let next in cur.nextNodes) {
                    if (!set.has(next)) {
                        queue.push(next);
                        set.add(next);
                    }
                }
            }
        }
    
        return -1;
    }

DFS

适用场景:

  • 类似BFS,一般的树/图遍历会选择DFS,符合人类的思维习惯。
    // 递归实现略
    
    // 遍历图寻找target,迭代实现
    const dfs = (root, target) => {
        // bfs使用队列,dfs使用栈
        const stack = [root];
        // 图中存在环时,需要申请哈希集记录遍历过的节点,以免节点重复入队造成死循环
        const set = new Set(root);
    
        while (stack.length) {
            // 栈顶节点出栈
            const cur = stack.pop();
            if (cur === target) {
                return true;
            }
            // 遍历当前节点的下一层节点
            for (let next in cur.nextNodes) {
                if (!set.has(next)) {
                    stack.push(next);
                    set.add(next);
                }
            }
        }
    
        return false;
    }

常用算法模板(一)
https://www.reimu747.ink/post/20230113.html
作者
Reimu747
发布于
2023年1月13日
许可协议