算法的时间复杂度表示程序运行所需要的时间,它定性的描述程序运行的时间,用大 O 表示,常见的时间复杂度为 O(1)、O(n)、O(logN)、O(n2)、没有循环的时间复杂度为 O(1), 有一层循环的为 O(n), n 为循环的次数
空间复杂度用来表示程序运行过程中临时占用内存空间大小的量度,同样也是用大 O 来表示
-
线性结构:是一个有序数据元素的集合。 其中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的。 常用的线性结构有:
栈,队列,链表。 -
非线性的结构:各个数据元素不再保持在一个线性序列中,每个数据元素可能与零个或者多个其他数据元素发生联系。 常用的线性结构有:
树、图、堆、字典、集合。
逻辑结构指的是数据间的关系,而存储结构是逻辑结构用计算机语言的实现。常见的存储结构有顺序存储、链式存储、索引存储以及散列存储
例如:栈和队列(JS 中为数组)在内存中的位置是连续的,它就属于顺序存储;链表是主动建立数据间的关联关系的,在内存中却不一定是连续的,它属于链式存储;还有顺序和逻辑上都不存在顺序关系,但是你可以通过一定的方式去访问它的字典和集合,是数据散列存储的。
特点:后进先出
使用场景: 十进制转二进制、JS 函数调用堆栈
JS 中使用: 使用 Array 模拟栈,push->入栈, pop->出栈
Leetcode 相关题:20 有效括号
特点:先进先出
使用场景: 食堂排队打饭、JS 异步中的任务队列
JS 中使用: 使用 Array 模模拟, push->入队, shift->出队
Leetcode 相关题:933 最近的请求次数
概述:多个元素组成的列表,元素的存储不连续的,用 next 指针连接在一起
与数组区别:增删高效,增删复杂度为 O(1),数组增删复杂度为 O(n)
js 中使用: 使用 Object 来模拟链表
JS 中相关知识点: 原型链、instanceof 的实现
常见操作: 删除节点、插入节点、遍历链表
双向链表:双向链表 JS 实现
Leetcode 相关题:
特点:一种无序且唯一的数据结构, ES6 中的 Set, (栈、队列、链表都是有序的数据结构)
常见操作:去重、判断元素是否存在集合中、求交集
Leetcode 相关题:349 两个数组的交集
特点:与集合类似,字典也是一种存储唯一值的数据结构,但它是以键值对的形式来存储的,ES6 中的 Map, 也可以用 Object 来实现
常见操作:键值对的增删改查(Map 中的 set、get、has、delete、clear)
Leetcode 相关题:
常见解法总结:
滑动窗口解法
双指针解法
概述:一种分层数据的抽象模型,JS 中没有树,但是可以用 Object 和 Array 构建树
使用场景:DOM 树、树形控件、级联选择
遍历方法:深度优先遍历(depth-first-search)/ 广度优先遍历(breadth-first-search)
概述:是一种特殊的树,一个节点最多只有两个叶子节点,js 中使用 Object 来模拟二叉树
遍历方式:
Leetcode 相关题:
概念: 图是网络结构的抽象模型,是一组由边连接的节点。图可以表示任何二元关系,比如道路、航班
图的表示方法:邻接矩阵、邻接表、关联矩阵...
邻接矩阵
邻接表
Leetcode 相关题:
概念:堆是一种特殊的完全二叉树, 所有节点都大于等于(最大堆)或小于等于(最小堆)他的子节点
最小堆
最大堆:
JS 中堆的表示:
使用数组来表示堆,左侧子节点的位置是 2*index +1,右侧子节点的位置是 2*index +2,父节点位置是(index-1)*2
(index 为数组的索引)
堆的应用:
-
堆能高效、快速地找出最大值和最小值,时间复杂度是 O(1)
-
找出第 K 个最大元素步骤
- 构建最小堆,将数组挨个插入到堆中
- 当堆的大小超过 k 时,将堆顶元素删除
- 当数组全部插入完后,堆顶即是第 k 个最大值
Leetcode 相关题:
各种排序算法动画演示:https://visualgo.net/zh/sorting
时间复杂度 O(n^2)
时间复杂度 O(n^2)
时间复杂度 O(n^2)
时间复杂度 O(n*logN)
leetcode 相关题:21 合并两个有序链表
时间复杂度 O(n*logN)
时间复杂度 O(n)
时间复杂度 O(logN)
leetcode 相关题:374 猜数字大小
概述:分而治之是算法设计中的一种方法,一种思想,它将一个问题分成多个原问题相似的小问题,递归解决小问题,再将结果合并以解决原来的问题, 关键点: 分(大问题分成小问题)->解(解决问题)->合并(合并结果)
使用场景: 归并排序、快速排序
leetcode 相关题:
概述:动态规划是算法设计中的一种方法,它将一个问题分解成为相互重叠的子问题,通过反复求解子问题,来解决问题。
与分而治之区别:分而治之是将问题分成独立的子问题,动态规划是将问题分解成相互重叠的子问题
使用场景:斐波那契数列
leetcode 相关题:
概述:贪心算法是算法设计中的一种方法,期盼通过每个阶段的局部最优选择,从而达到全局的最优,结果不一定是最优
leetcode 相关题:
概述:回溯算法是算法设计中的一种方法, 回溯算法是一种渐进式寻找并构建问题解决方式的策略
思路: 用递归模拟出所有情况,遇到包含重复元素的情况,就回溯,收集所有到达递归终点的情况,并返回收集的结果
leetcode 相关题:











