算法学习
- 刷题的网站,leetcode
- 刷题的顺序 推荐按类型来刷题,比如数组,链表,二叉树,动态规划,贪心算法,回溯算法,分治算法,排序,搜索,位运算,字符串,哈希
- 重点关注,动态规划,贪心算法,回溯算法,分治算法,排序,搜索,位运算,字符串,哈希
- 算法是解决一类问题的套路,数据结构是组织数据的结构,时间、空间复杂度
数据结构
- 计算机存储,组织数据的方式,比如锅碗瓢盆
- 算法 一系列解决问题的清晰的指令
- 程序 = 算法 + 数据结构
- 数据结构为算法服务的,算法围绕数据结构进行操作
分类
- 线性结构 数组,链表,栈,队列
- 非线性结构 树,图,堆,字典,集合
时间复杂度
- 算法执行的时间,时间复杂度,用大 O 表示法,O(n),O(n2),O(n3)
O(1)
不变的量,比如常数,时间复杂度为 1
let i =0
i+=
O(n)
随着 n 的增大,时间复杂度会增大
for (let i = 0; i < n; i++) {
console.log(i)
}
O(n^2)
随着 n 的增大,时间复杂度会增大平方
for (let i = 0; i < n; i++) {
for (let j = 0; j < n; j++) {
consloe.log(i, j)
}
}
O(n^3)
随着 n 的增大,时间复杂度会增大立方
for (let i = 0; i < n; i++) {
for (let j = 0; j < n; j++) {
for (let k = 0; k < n; k++) {
console.log(i, j, k)
}
}
}
O(logN)
随着 n 的增大,时间复杂度会增大对数
let i = 0
while (i < n) {
console.log(i)
i = i * 2
}
空间复杂度
-
算法执行时占用的内存空间,空间复杂度,用大 O 表示法,O(1),O(n)
-
空间复杂度主要关注变量,比如数组,对象,函数,字符串等占用内存的大小
0(1)
let i = 0
i += 1
`
O(n)
let arr = []
for (let i = 0; i < n; i++) {
arr.push(i)
}
`O(n^2)``
let arr = []
for (let i = 0; i < n; i++) {
arr.push([])
for (let j = 0; j < n; j++) {
arr[i].push(j)
}
}
栈
后进先出,在栈顶端进行数据的操作
使用场景
- 十进制转二进制
栈
后进先出,在栈顶端进行数据的操作
使用场景
-
十进制转二进制
-
括号匹配
-
函数调用栈
最后调用的函数,是最先执行完的
- 浏览器前进后退
实现
//匹配的括号
const isValid = function (str) {
const stack = []
if (str.length % 2 !== 0) return false
for (let i = 0; i < str.length; i++) {
const char = str[i]
if (['(', '{', '['].includes(char)) {
stack.push(char)
} else {
const top = stack.pop()
if (!top) {
return false
}
if (
(char === ')' && top !== '(') ||
(char === '}' && top !== '{') ||
(char === ']' && top !== '[')
) {
return false
}
}
}
//判断栈是否为空,为空说明匹配
return !stack.length
}
const t1 = isValid('()')
console.log('🚀 ~ t1:', t1)
const t2 = isValid('()[]{}')
console.log('🚀 ~ t2:', t2)
const t3 = isValid('([)]')
console.log('🚀 ~ t3:', t3)
const t4 = isValid('((()')
console.log('🚀 ~ t4:', t4)
const t5 = isValid('(()')
console.log('🚀 ~ t5:', t5)