算法

精通一个领域

chunk it up (拆解)

deliberate practicing (刻意练习)

feedback (反馈)

切题四件套

Clarification

Possible solutions compare(time/space) optimal(加强)

Coding (多写)

Test cases

数据结构 array stack 、queue priorityQueue(heap) LinkedList(single、double) Tree、Binary tree binary search tree hashTable Disjoint Set Trie BloomFilter LRU Cache

算法 general code in-order/Pre-order/Post-order traversal Greedy Recursion/Backtrace Breadth-first search Depth-first search Divide and Conquer Dynamic Programming Binary Search Graph

时间复杂度

Big O notation

维护这个堆

维护堆顶元素

这个是O(n1)

Queue 双端队列 deque

三数之和

Linked List 就是特殊化的 Tree Tree 就是特殊化的Graph

二叉查找树

二叉排序树

分治:

分治

互不关联的子问题 求解

问题求解

if(7%2) { console.log(1)} // 这是奇数 所以会输出 1

求众数

贪心算法:

动态规划的不同点在于对每个子问题的解决方案都做出选择,不能回退。动态规划则会保存以前的运算结果,并根据以前的结果对当前进行选择,有回退功能。

【BFS(广度优先搜索)和DFS(深度优先搜索)】

  • BFS是一层一层地搜索,先搜索子节点,再搜索孙子节点。DFS是一插到底,先搜索子节点,以及孙子节点等等,直到没有子节点为止。然后再回溯,看看有没有漏网之鱼。

  • BFS更符合人类的思维习惯,DFS更符合计算机的思维习惯。

  • BFS底层用队列来实现,DFS在实现时常常用递归来写,但最终还是用栈

要注意 树的搜索和图的搜索的区别:是否需要记录visited

var generateParenthesis = function(n) {
    var list = [];
    _gen(0, 0, n, "")
    return list

    function _gen(left, right, n ,result){
        if(left == n && right ==n){
            list.push(result)
            return 
        }
        if(left < n){
            _gen(left + 1, right, n, result + "(")
        }
        if(left > right && right < n){
            _gen(left, right +1, n, result + ")")
        }
    }
};

两种情况使用剪枝: 1.搜索范围过大 2.一看就不需要找

最后更新于

这有帮助吗?