算法训练营学习笔记开篇

算法训练营学习笔记开篇

背景

距离课程过期只剩33天。

目的

过期前完成课程。

蓝图

算法是编程最基础的能力,不论什么编程行业都是根基。如果把编程能力的高低看成是修建建筑物的话,那么算法就是地基的作用。大概在我的蓝图中就是这样的一个概念。

如何精通一个领域

Chunk it up(马斯克的方法)

分解:将整体划分成一个个独立的小部分
连接:将每个独立的知识点进行连接
效果:庖丁解牛,游刃有余,了然于胸,运筹帷幄做理性的决策。

Musk: One bit of advice: it is important to view knowledge as sort of a semantic tree – make sure you understand the fundamental principles, i.e. the trunk and big branchese, before you get into the leaves/details or there is nothing for them to hang on to.

数据结构:

  • 一维
    • 基础:数组array/string, 链表linked list
    • 高级:栈stack, 队列queue, 双端队列deque, 集合set, 映射map, etc
  • 二维
    • 基础:树 tree, 图graph
    • 高级:二叉搜索树 binary search tree(red-black tree, AVL), 堆heap, 并查集 disjoint set, 字典树 Trie, etc
  • 特殊
    • 位运算Bitwise, 布隆过滤器BloomFilter
    • LRU Cache

算法

  • if-else, switch --> branch
  • for,while loop --> iteration
  • 递归Recursion(Divide & Conquer, Backtrace):函数自己调用自己
  • 搜索Search:深度优先搜索 Depth First Search, 广度优先搜索 Breadth First Search, A*, etc
  • 动态规划 Dynamic Programming
  • 二分查找 Binary Search
  • 贪心Greedy
  • 数学Math, 几何Geometry

tip: 在头脑中回忆上面每种算法的思想和代码模版

概念

具体的概念就放到后面的文章单独去说吧~

Big O notation

O:表示它的复杂度是关于n的怎样的一个函数。

时间复杂度(看执行次数)

  • O(1): Constant Complexit 常数复杂度
  • O(log n): Logarithmic Complexity 对数复杂度
  • O(n): Linear Complexity 线性时间复杂度
  • O(n^2): N square Complexity 平方
  • O(n^3): N cubic Complexity 立方
  • O(2^n): Exponential Growth 指数
  • O(n!): Factorial 阶乘

时间复杂度

  • 数组的长度
  • 递归的深度

主定理

用来解决所有递归的函数,计算这些函数的时间复杂度。

  • Binary Search: O(logn)
  • Binary tree traversal: O(n) -> 每个节点会访问一次且仅访问一次
  • Optimal sorted matrix search: O(n)
  • Merge sort: O(nlogn)

规格

练习

摒弃“旧习惯”-最重要

  • 不要死磕(传统方式)
  • 使用五毒神掌(敢于放手、敢于死记硬背代码)
  • 不懒于看高手的代码(国际版的高票答案)
  • 最佳方式:5分钟想不出来,直接看题解或者高票代码,用五毒神掌变成自己的东西。这个过程:觉得自己很菜甚至有点自卑,但是有借势而起的感觉。
  • 最差方式:看到题目想自己单挑一下,不借助外部帮助自己解决;以为15~30分钟就可以搞定,谁知道死磕了2~3个小时或者一晚上,终于“通过”。精疲力竭,没有精力学习高票程序代码,就开始做下一题(或放弃)。

Deliberate Practicing

基本功:基础动作的分解训练和反复练习 --> 过遍数 --> 五遍刷题法(五毒神掌)
练习缺陷,弱点地方,会经历不舒服,不爽,枯燥 —> 舒适区

Feedback

  • 即时反馈
  • 主动型反馈
    • 高手代码(GitHub,LeetCode, etc)
    • Faker第一视角直播
  • 被动式反馈(高手给你指点)
    • code review

切题四件套

  • Clarification 明确题意
  • Possible solutions
    • compare (time/space)
    • optimal (加强)
  • Coding
  • Test cases

五毒神掌

刷题第一遍

  • 5分钟:读题 + 思考
  • 直接看解法:注意不要死扣钻牛角尖! 多解法,比较解法优劣。
  • 背诵默写

刷题第二遍

  • 马上自己写 --> LeetCode 提交
  • 多种解法比较,体会 --> 优化!

刷题第三遍

  • 过了一天后,再重复做题
  • 不同解法的熟练程度 --> 专项练习

刷题第四遍

  • 过了一周:反复回来联系相同题目

刷题第五遍

  • 面试前一周恢复性训练

思考题

  • 二叉树遍历 -前序、中序、后序:时间复杂度是多少?
  • 图的遍历:时间复杂度是多少?
  • 搜索算法:DFS、BFS时间复杂度是多少?
  • 二分查找:时间复杂度是多少?

感想

  • 对自己程序的时间和空间复杂度能够清晰的算出来;并且要养成习惯,写完之后能够分析出这段程序的时间和空间复杂度。
  • 对自己要有一定的要求,能够用最简洁的时间和空间复杂度完成这段代码,这是一个顶尖程序员的必备素养。
  • 放轻松去完成挑战吧~

你可能感兴趣的:(算法训练营笔记,算法,面试)