数据结构和算法
文章平均质量分 70
数据结构和算法
sayid760
日常知识压缩整理、以备不时之需;
欢迎拍砖,不足之处还望博友指出
展开
-
【前端算法系列】算法总结
字符串反转回文(反转后相同;中间劈开对称性)技巧:双指针原创 2020-12-31 21:49:17 · 264 阅读 · 0 评论 -
【前端算法系列】时间复杂度和空间复杂度
常数时间复杂度或者O(1)原创 2021-01-21 13:15:10 · 700 阅读 · 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 · 320 阅读 · 0 评论 -
【前端算法系列】数组
数组查找:通过下标找值 O(1)复杂度插入:插入后,后面的元素要往后移动 O(n)几重循环,如果插到最后一位是O(1)删除:删除后,后面的元素往前移动(复杂度同插入)插入和删除非多,可以用链表来改善常用:双指针方法(用来缩小范围):用在涉及求和、比大小类的数组题目(此类题目前提是该数组必须有序。否则双指针根本无法帮助我们缩小定位的范围,压根没有意义,所以要提前排序)★ 移动零function solution(arr){ let j=0 for(let i=0;原创 2021-01-21 11:39:52 · 378 阅读 · 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 · 100 阅读 · 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 · 543 阅读 · 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 · 266 阅读 · 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 · 623 阅读 · 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 · 202 阅读 · 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 · 169 阅读 · 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 · 690 阅读 · 0 评论 -
【前端算法系列】平衡二叉树
平衡二叉树:是一种结构平衡的二叉搜索树,即叶子节点深度差不超过1,能够在O(logn)内完成插入、查找和删除操作(查找效率高)110. 平衡二叉树平衡二叉树特点:叶子节点深度差不超过1const isBalanced = function(root) { // 立一个flag,只要有一个高度差绝对值大于1,这个flag就会被置为false let flag = true // 定义递归逻辑 function dfs(root) { // 如果是空树,高度记为0;如果flag原创 2021-01-11 12:54:31 · 211 阅读 · 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 · 399 阅读 · 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 · 196 阅读 · 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 · 125 阅读 · 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 · 102 阅读 · 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 · 218 阅读 · 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 · 420 阅读 · 0 评论 -
【前端算法系列】分而治之
374. 猜数字大小分而治之版的递归搜索/* 时间复杂度:O(logN) 每次还是缩小一半范围,执行次数是logN次 空间复杂度:递归是调用堆栈,在栈里面变量是要被存起来的,没有被释放,变量存储的值是线性增长, 执行次数要看递归堆栈多少层 O(logN),建议不用递归,用while*/var guessNumber = function(n) { const rec = (low, high) => { // 递归终结条件 if(low &原创 2021-01-06 21:44:22 · 140 阅读 · 0 评论 -
【前端算法系列】排序
文章目录冒泡排序 Bubble选择排序 Select插入排序 Insert希尔排序 Shell(高级排序,是插入排序的改良版)归并排序 Merge(火狐浏览器sort)快速排序 Quick (谷歌sort)冒泡、选择、插入、归并、快速(前三个O(n^2),后两个O(n*logN))冒泡排序 Bubble1)比较所有相邻元素,如果第一个比第二个大,则交换它们 2)一轮下来,可以保证最后一个数是最大的 3)执行n-1轮,就可以完成排序// 时间复杂度:O(n^2) 两个嵌套循环Array.pro原创 2021-01-07 21:19:20 · 174 阅读 · 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 · 123 阅读 · 0 评论