
数据结构和算法
文章平均质量分 70
数据结构和算法
sayid760
日常知识压缩整理、以备不时之需;
欢迎拍砖,不足之处还望博友指出
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【前端算法系列】算法总结
字符串 反转 回文(反转后相同;中间劈开对称性) 技巧:双指针原创 2020-12-31 21:49:17 · 314 阅读 · 0 评论 -
【前端算法系列】时间复杂度和空间复杂度
常数时间复杂度或者O(1)原创 2021-01-21 13:15:10 · 778 阅读 · 0 评论 -
【前端算法系列】字符串
常用技能 反转字符串 str.split('').reverse().join('') 回文字符串(对称性和双指针) 反转完等于现状 可以从中间位置劈开,两边的子串在内容上完全对称 const len = str.length // 遍历前半部分,判断和后半部分是否对称 for(let i=0; i<len/2; i++){ if(str[i]!==str[len-i-1]){ return false } } 字符串常用方法 str.trim()原创 2021-01-21 11:41:32 · 408 阅读 · 0 评论 -
【前端算法系列】数组
数组 查找:通过下标找值 O(1)复杂度 插入:插入后,后面的元素要往后移动 O(n)几重循环,如果插到最后一位是O(1) 删除:删除后,后面的元素往前移动(复杂度同插入) 插入和删除非多,可以用链表来改善 常用: 双指针方法(用来缩小范围):用在涉及求和、比大小类的数组题目(此类题目前提是该数组必须有序。否则双指针根本无法帮助我们缩小定位的范围,压根没有意义,所以要提前排序) ★ 移动零 function solution(arr){ let j=0 for(let i=0;原创 2021-01-21 11:39:52 · 431 阅读 · 0 评论 -
【前端算法系列】正则表达式
* 0或者多次(尽可能匹配多次) + 至少1次 ? 0或者1次 ?:尽可能少的匹配,,+后的?表示非贪婪匹du配 \s 匹配任意的空白符(包括空格,制表符(Tab),换行符,中文全角空格) \S 则是任意不是空白符的字符 \w 匹配包括下划线的任何单词字符,等价于 [A-Z a-z 0-9_] \W 匹配任何非单词字符,等价于 [^A-Z a-z 0-9_] " " ^匹配开始时,$匹配结尾 () 是为了提取匹配的字符串 [] 是定义匹配的字符范围 {}...原创 2021-01-21 11:35:59 · 139 阅读 · 0 评论 -
【前端算法系列】位运算
含义 运算符 示例 左移 << 0011 => 0110 右移 >> 0110 => 0011 按位或 | 0011 | 1011 => 1011 只要有一个是0就是0 按位与 & 0011 & 1011 => 0011 相同为1不同为0 按位取反 ~ 0011 => 1100 0变1,1变0 按位异或 ^ 0011 ^ 1011 => 1000 相同为0不同为1 异或 相同为0,不同为1。也...原创 2021-01-19 15:15:27 · 612 阅读 · 0 评论 -
【前端算法系列】栈
★20.有效的括号 1)新建一个栈 2)扫描字符串,遇到左括号入栈,遇到和栈顶括号匹配的右括号就出栈 3)最后栈空了表示闭合 /* 时间复杂度:只有一个for循环,push/pop操作都是O(1),就可以认为时间复杂度为O(n),n为s的长度 空间复杂度:定义一个数组,可能把s的长度都push进去,所以空间复杂度为O(n) */ var isVaild=function(s){ if(s.length%2 === 1) return false // 判断长度是否为偶数,奇数表示不用继续下去了,.原创 2021-01-15 21:03:27 · 344 阅读 · 0 评论 -
【前端算法系列】队列queue
933.最近的请求次数 有新请求就入队,3000ms前发出的请求出队 队列的长度就是最近请求次数 /** 时间复杂度:O(n) while循环体 n为踢出对的请求个数 * 空间复杂度:O(n) 定义了一个数组,n为队列的长度 */ var RecentCounter = function() { this.q = [] }; RecentCounter.prototype.ping = function(t) { // 新请求入队 this.q.push(t) //原创 2021-01-14 22:00:23 · 690 阅读 · 0 评论 -
【前端算法系列】链表
933. 最近的请求次数 有新请求就入队,3000ms前发出的请求出队 队列长度就是最近请求次数 /* 时间复杂度:有while循环体,时间复杂度是O(n),n就是被踢出去的请求个数 空间复杂度 O(n):设置了数组this.q,队列的长度是请求个数,n */ var RecentCounter = function(){ this.q = [] } RecentCounter.prototype.ping=function(t){ this.q.push(t) //原创 2021-01-13 21:05:36 · 239 阅读 · 0 评论 -
【前端算法系列】集合Set
349. 两个数组的交集 去重后再遍历就不会输出重复的值 /* 时间复杂度:嵌套遍历,所以是O(n^2) * 空间复杂度:num1、num2都是已有的存储,O(n),n是去重后的长度 */ var intersection = function(num1,num2){ // return [...new Set(num1)].filter(n=> new Set(nums2).has(n)) 耗内存 return [...new Set(num1)].filter(n=>原创 2021-01-12 14:26:28 · 205 阅读 · 0 评论 -
【前端算法系列】字典
349.两个数组的交集 1)新建一个字典,遍历nums1,填充字典 2)遍历nums2,遇到字典里的值就选出,并从字典中删除 /* 时间复杂度:O(n) 空间复杂度:O(n) */ var intersection = function(nums1, nums2) { const map = new Map() nums1.forEach(n=>{ map.set(n, true) }) const res=[] nums2.forEach原创 2021-01-12 14:25:06 · 780 阅读 · 0 评论 -
【前端算法系列】平衡二叉树
平衡二叉树:是一种结构平衡的二叉搜索树,即叶子节点深度差不超过1,能够在O(logn)内完成插入、查找和删除操作(查找效率高) 110. 平衡二叉树 平衡二叉树特点:叶子节点深度差不超过1 const isBalanced = function(root) { // 立一个flag,只要有一个高度差绝对值大于1,这个flag就会被置为false let flag = true // 定义递归逻辑 function dfs(root) { // 如果是空树,高度记为0;如果flag原创 2021-01-11 12:54:31 · 271 阅读 · 0 评论 -
【前端算法系列】二叉搜索树
二叉搜索树特点:可为空树;或满足左子节点(最小) <= 根节点 <= 右子节点(最大),不存在相等值的节点;具有有序性 搜索效率之高: 1、线性查找:从左到右一个个查找,找10次。 2、比如搜索10,10大于9,又是二叉搜索树,所以一定在右边。找到13,10又比13小,所以找左边11;10又比11小,找左边 3、二叉查找树:如果这个数组是有序的,可以从中间开始查找,找到中间值8,10比8大,找右边;再进行二分,找中间值11,10小于11,最终找到10 4、哈希表,是无序的,会造成空间浪费 应用原创 2021-01-11 12:53:28 · 469 阅读 · 0 评论 -
【前端算法系列】树
104. 二叉树的最大深度 思路:在深度优先遍历过程中,记录每个节点所在层级,找出最大层级即可 1)新建一个变量,记录最大深度 2)深度优先遍历整颗树,并记录每个节点的层级,同时不断刷新最大深度这个变量 3)遍历结束返回最大深度这个变量 /** 时间复杂度:O(n) n是树的结点 空间复杂度:函数调用函数会形成堆栈 O(logN) */ var maxDepth = function(root) { let res = 0 const dfs = (n, l) =>{原创 2021-01-10 22:01:00 · 227 阅读 · 0 评论 -
【前端算法系列】堆
215. 数组中的第K个最大元素 看到“第K个最大元素”,就用最小堆 思路:构建一个最小堆,并依次把数组的值插入堆中。当堆的容量超过k,就删除堆顶。插入结束后,堆顶就是第K个最大元素 可以想象是一个小公司,堆顶是最弱的员工,当发现超出人数了,就要裁员,经过优胜劣汰,不断去淘汰堆顶 /** 时间复杂度:O(N*logK) 循环嵌套循环 k为堆的大小 N为nums的长度(循环次数) * 空间复杂度:O(k) k为堆的长度 */ var findKthLargest = function(nums原创 2021-01-09 14:19:12 · 158 阅读 · 0 评论 -
【前端算法系列】图
417. 太平洋大西洋水流问题 思路:深度优先遍历,逆流而上(比它大或者同等)的就是可以流到太平洋或者大西洋的坐标 var pacificAtlantic = function(matrix) { if(!matrix||!matrix[0]) return [] const m = matrix.length // 行 const n = matrix[0].length // 列 const flow1 = Array.from({length:m},()=>new原创 2021-01-09 12:56:37 · 125 阅读 · 0 评论 -
【前端算法系列】动态规划
文章目录斐波那契数列和爬楼梯问题198.打家劫舍零钱兑换题1. [零钱兑换(求最少硬币个数)](https://leetcode-cn.com/problems/coin-change/)零钱兑换2(求方法种类)股票问题路径问题剪绳问题最大最小背包问题 斐波那契数列和爬楼梯问题 两者区别在于:dp[0]边界的处理,斐波那契dp[0]=0,爬楼梯问题中dp[0]=1 // 关于:% (1e9 +7)对质数取模的话,能尽可能地避免模数相同的数之间具备公因数,来达到减少冲突的目的 // 傻递归 f(n) = f原创 2021-01-04 21:38:06 · 295 阅读 · 0 评论 -
【前端算法系列】贪心算法
455.分发饼干 // 时间复杂度:O(N*logN) 因为谷歌排序为快排,火狐为归并,都是O(N*logN) var findContentChildren = function(g, s) { const sortFunc = function(a,b){ return a-b } g.sort(sortFunc) s.sort(sortFunc) let i = 0 s.forEach(n=>{ if(n>=g原创 2021-01-05 22:44:56 · 487 阅读 · 0 评论 -
【前端算法系列】分而治之
374. 猜数字大小 分而治之版的递归搜索 /* 时间复杂度:O(logN) 每次还是缩小一半范围,执行次数是logN次 空间复杂度:递归是调用堆栈,在栈里面变量是要被存起来的,没有被释放,变量存储的值是线性增长, 执行次数要看递归堆栈多少层 O(logN),建议不用递归,用while */ var guessNumber = function(n) { const rec = (low, high) => { // 递归终结条件 if(low &原创 2021-01-06 21:44:22 · 197 阅读 · 0 评论 -
【前端算法系列】排序
文章目录冒泡排序 Bubble选择排序 Select插入排序 Insert希尔排序 Shell(高级排序,是插入排序的改良版)归并排序 Merge(火狐浏览器sort)快速排序 Quick (谷歌sort) 冒泡、选择、插入、归并、快速(前三个O(n^2),后两个O(n*logN)) 冒泡排序 Bubble 1)比较所有相邻元素,如果第一个比第二个大,则交换它们 2)一轮下来,可以保证最后一个数是最大的 3)执行n-1轮,就可以完成排序 // 时间复杂度:O(n^2) 两个嵌套循环 Array.pro原创 2021-01-07 21:19:20 · 286 阅读 · 2 评论 -
【前端算法系列】搜索
顺序搜索 遍历数组,找到跟目标相等的元素,就返回它的下标,遍历结束后,没找到就返回-1 // 时间复杂度:O(n) 循环 Array.prototype.sequentialSearch = function (item) { for(let i=0;i<this.length;i+=1){ if(this[i] === item){ return i } } return -1 }; const arr = [5, 4, 3, 2, 1] arr.sequen原创 2021-01-08 23:04:04 · 190 阅读 · 0 评论