五大算法
- 贪心算法:局部最优解法
- 分治算法:分成多个小模块,与原问题性质相同
- 动态规划:每个状态都是过去历史的一个总结
- 回溯法:发现原先选择不优时,退回重新选择
- 分支限界法:按广度优先策略搜索问题的解空间树,适合求解最优化问题
数据树
二叉树: 最多只有两个子节点
- 完全二叉树
- 若设二叉树的深度为k,除第 k 层外,其它各层 (1~k-1) 的结点数都达到最大个数,第k 层所有的结点都连续集中在最左边
- 满二叉树
- 深度为 h, 有 n 个节点,且满足 n = 2^h - 1
- 平衡二叉树
- 它或者是一颗空树,或它的左子树和右子树的深度之差(平衡因子)的绝对值不超过1,且它的左子树和右子树都是一颗平衡二叉树
- 最优二叉树(哈夫曼树)
- 树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。
- 完全二叉树
二叉查找树: 是一种特殊的二叉树,能有效地提高查找效率
- 小值在左,大值在右
- 节点 n 的所有左子树值小于 n,所有右子树值大于 n
- 遍历节点
- 前序遍历
- 根节点
- 访问左子节点,回到 1
- 访问右子节点,回到 1
- 中序遍历
- 先访问到最左的子节点
- 访问该节点的父节点
- 访问该父节点的右子节点, 回到 1
- 后序遍历
- 先访问到最左的子节点
- 访问相邻的右节点
- 访问父节点, 回到 1
- 前序遍历
DLR–前序遍历(根在前,从左往右,一棵树的根永远在左子树前面,左子树又永远在右子树前面 )
LDR–中序遍历(根在中,从左往右,一棵树的左子树永远在根前面,根永远在右子树前面)
LRD–后序遍历(根在后,从左往右,一棵树的左子树永远在右子树前面,右子树永远在根前面)
- 插入与删除节点
写出一个方法输出1-100内的所有素数
解析: 由素数(质数)定义可知:
- ① 0、1都不是质数,那么最小的质数就是2。
- ② 除了1和它自身,不能被其他数整除,那么代码表达式表示为:
1 | i % j === 0 |
- 代码实现
1 | function fn() { |
(数组中第K大元素)给定一个整数数组,实现快速排序算法进行升序排列。如[2, 5, 8, 9, 3] =>[2, 3, 5, 8, 9]
解析:(分治法) 将一个列表分割为左右两块,然后再将字列表再进行分割为左右两块,如何反复,知道子元素长度为1时,结束!
- 代码实现
1
2
3
4
5
6
7
8
9
10
11
12
13function qSort(arr) {
if (arr.length <= 1) return arr
const index = Math.floor(arr.length / 2)
const midVal = arr.splice(index, 1)[0]
const left = [],
right = []
arr.forEach(item => {
if (item < midVal) left.push(item)
else right.push(item)
})
return [...qSort(left), midVal, ...qSort(right)]
}
qSort([2, 5, 8, 9, 3])
求一个字符串中最长的非重复连续子串
1 | function find(s) { |
求字符串数组的最长公共前缀
比如输入: [“flower”,”flow”,”flight”],输出: “fl”
1 | var longestCommonPrefix = function(strs) { |
实现二叉树(构建、遍历)
1 | function TreeCode() { |
二叉树的非递归遍历
深度优先非递归(栈的先进后出)DFS
1 | function DepthFirstSearch(biTree) { |
广度优先非递归(队列的先进先出)BFS
1 | function BreadthFirstSearch(biTree) { |
一个数组,里面是排好序的数字,输入一个数字怎么能找到它的index
把这些数字放到对象的key里,index变成value,然后直接取 时间复杂度O(n) => O(1)
二分法查找
1 | let arr = [0, 1, 2, 4, 5, 6, 7, 8]; |
洗牌(乱序)算法
时间复杂度:O(n²)
1 | function shuffle(arr) { |
时间复杂度:O(n)空间复杂度O(1)
1 | function shuffle(arr) { |
两数之和
[2,7,11,88,34],9 => [0,1]
双循环
1 | function twoSum(arr, target) { |
Map
1 | function(arr, target) { |
假设有130个苹果,你我轮流拿,每次可拿1-5个,如何保证你拿到最后一个苹果
巴什博奕嘛保证剩最后6个给对面取,先取者可必胜,第一次取4个,剩126个,对面随便取,取的时候保证一直剩余6的倍数,最后一定出现剩6个苹果的情况。
手动控制并发请求fetchWithLimit
1 | function fetchWithLimit(urls, max, callback) { |
有一个数n=5,不用for循环,怎么返回[1,2,3,4,5]这样一个数组
1 | function getArr(n) { |
判断单链表是否有环
1 | function main(node){ |