算法
精通一个领域
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
时间复杂度

维护这个堆
维护堆顶元素
这个是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.一看就不需要找
最后更新于
这有帮助吗?