
前端必刷数据结构
文章平均质量分 56
前端的面试必刷数据结构
那就可爱多一点点
程序员,喜欢和挑战的前端童鞋,希望可以一起沟通学习
展开
-
前端必备数据结构:(栈)大数相加
一、题目来源:leetCode 415. 字符串相加题目描述:给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。............原创 2022-06-04 16:03:54 · 120 阅读 · 0 评论 -
前端必备数据结构:(DFS)括号生成
一、题目来源:leetCode 22. 括号生成题目描述:数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。示例 1:输入:n = 3输出:["((()))","(()())","(())()","()(())","()()()"]示例 2:输入:n = 1输出:["()"]解题思路:利用括号的一对的原则,多少个左括号就必须有多少个右括号,停下来的判定是字符串的长度等于括号数*2 var generateParenthesis = fun原创 2022-04-11 15:50:16 · 625 阅读 · 0 评论 -
前端必备数据结构:(链表)判定回文链表
一、题目来源:leetCode 234. 回文链表题目描述:给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。示例 1:输入:head = [1,2,2,1]输出:true示例 2:输入:head = [1,2]输出:false解题思路:利用栈的先进后出原理。将链表对半,左半部分推入栈中,再出栈和右半部分进行对比,相同则是回文链表。var isPalindrome = function(head) {原创 2022-04-06 22:39:32 · 652 阅读 · 0 评论 -
前端必备数据结构:归并排序
按照分治法的思想,先拆分后合并。其时间复杂度是 nlogn,属于稳定排序function get() { var str = [1,3,4,2] sort(str)}function sort(arr) { let len = arr.length if(len == 1) return arr var temp = Math.floor((0+len)/2) var str1 = arr.slice(0, temp) var str2 = arr.slice(temp) retu原创 2022-03-30 19:45:25 · 560 阅读 · 0 评论 -
前端必备数据结构:最长公共子序列
题目来源:leetCode 剑指 Offer II 095. 最长公共子序列题目描述 :给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。两个字符串的 公共子序列 是这两个字符串所共同原创 2022-03-30 15:19:49 · 573 阅读 · 0 评论 -
前端必备数据结构:(动态规划)最长不含重复字符的子字符串
题目来源:剑指 Offer 48. 最长不含重复字符的子字符串题目描述 :请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。示例1:输入: "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例2:输入: "pwwkew"输出: 3解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。/** * @para原创 2022-03-29 11:34:15 · 137 阅读 · 0 评论 -
前端必备数据结构:(二叉树)二叉树的层序遍历
一、题目来源:102. 二叉树的层序遍历二叉树的遍历一共有四种方式前序遍历中序遍历后序遍历层次遍历题目描述:示例 1:输入:root = [3,9,20,null,null,15,7]输出:[[3],[9,20],[15,7]]示例2输入:root = [1]输出:[[1]]解题思路层次遍历的意思就是每一层从左往右遍历。累加起来的遍历数据就是输出结果。所以定义一个数组存每一层的节点值。并存每一层节点,作为每一次循环的根节点。遍历结束的依据就是这一层没有节点。原创 2022-03-24 15:09:00 · 332 阅读 · 0 评论 -
前端必备数据结构:(动态规划)最长的递增子序列
一、题目来源:300. 最长递增子序列题目描述:给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。示例 1:输入:nums = [10,9,2,5,3,7,101,18]输出:4解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。示例2输入:nums = [0,1,0,3,2,3]输出:4解题原创 2022-03-18 16:04:46 · 674 阅读 · 0 评论 -
前端必备数据结构:(深度优先搜索)路经总和Ⅱ
一、题目来源:113. 路径总和 II题目描述:给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。叶子节点 是指没有子节点的节点。示例 1:输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22输出:[[5,4,11,2],[5,8,4,5]]示例2输入:root = [1,2,3], targetSum = 5输出:[]原创 2022-03-02 10:59:02 · 282 阅读 · 0 评论 -
前端必备数据结构:(深度优先搜索)路经总和
一、题目来源:112. 路径总和题目描述:给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。叶子节点 是指没有子节点的节点。示例 1:输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22输出:true解释:等于目标和的根节点到叶节原创 2022-03-01 21:24:37 · 371 阅读 · 0 评论 -
前端必备数据结构:(双指针)求面积最大的坐标
一、题目来源:46. 全排列题目描述:给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案示例 1:输入:nums = [1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2:输入:nums = [0,1]输出:[[0,1],[1,0]]示例 3:输入:nums = [1]输出:[[1]]解题思路每个位置不同产生的排列就不同,但是不能重复使用数字,所以需要原创 2022-03-01 11:20:26 · 139 阅读 · 0 评论 -
前端必备数据结构:(回溯算法)求子集
一、题目来源:78. 子集题目描述:给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。。示例 1:输入:nums = [1,2,3]输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]示例 2:输入:nums = [0]输出:[[],[0]]解题思路利用递归,因为子集不能重复:携带两个参数,一个是当前下标,和记录的子集,临界条件就是:下标ind原创 2022-03-01 11:11:56 · 142 阅读 · 0 评论 -
前端必备数据结构: 螺旋矩阵
一、题目来源:54. 螺旋矩阵题目描述:给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。示例 1:输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]示例 2:输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]输出:[1,2,3,4,8,12,11,10,9,5,6,7]解题思路因为螺旋矩阵是从第一个数开始遍历,一圈一圈的循环进原创 2022-02-11 14:07:29 · 580 阅读 · 0 评论 -
前端必备数据结构:(双指针)求面积最大的坐标
一、题目来源:11. 盛最多水的容器题目描述:给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。说明:你不能倾斜容器。示例 1:输入:[1,8,6,2,5,4,8,3,7]输出:49 解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)原创 2022-01-21 14:52:24 · 514 阅读 · 0 评论 -
前端必备数据结构:(双指针)求三数之和
一、题目来源:leetCode 15. 三数之和题目描述:给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。注意:答案中不可以包含重复的三元组。示例 1:示例 1:输入:nums = [-1,0,1,2,-1,-4]输出:[[-1,-1,2],[-1,0,1]]示例 2:输入:nums = []输出:[]示例 3:输入:nums = [0]输出:[]解原创 2022-01-13 15:37:25 · 316 阅读 · 0 评论 -
前端必备数据结构:(动态规划)求 最长回文子串
一、题目来源:leetCode 5. 最长回文子串题目描述:给你一个字符串 s,找到 s 中最长的回文子串。示例 1:输入:s = "babad"输出:"bab"解释:"aba" 同样是符合题意的答案。示例 2:输入:s = "cbbd"输出:"bb"解答思路:回文数的意思是:字符串反转和原字符串一样,例如 'aba ’ 反转 也是 'aba '.还有临界值,当字符串长度为1 或者 2 时,如果长度是 1 那必然是回文,长度为 2 只要保证这两个字符相同就是回文。其他长度的原创 2022-01-11 11:40:05 · 349 阅读 · 0 评论 -
前端必备数据结构:(链表)求指定路径的和
一、题目来源:leetCode 112. 路径总和题目描述:给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。叶子节点 是指没有子节点的节点。示例 1:输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22输出:true解释:等于原创 2021-12-10 15:27:53 · 593 阅读 · 0 评论 -
前端必备数据结构:(动态规划)巧用数组解决两数之和
题目来源:leetCode 1. 两数之和题目描述:给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。示例 1:输入:nums = [2,7,11,15], target = 9输出:[0,1]解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。示例 2:原创 2021-12-07 17:46:58 · 438 阅读 · 0 评论 -
前端必备数据结构:最大子序和
题目来源:leetCode 53. 最大子序和题目描述:给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例 1:输入:nums = [-2,1,-3,4,-1,2,1,-5,4]输出:6解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。示例 2:输入:nums = [1]输出:1示例 3:输入:nums = [0]输出:0解答思路:命名一个新的数组dp,用来存当前位置的最大值,从第二个开始, dp[ 0原创 2021-12-07 11:13:41 · 236 阅读 · 0 评论 -
前端必备数据结构:栈 (括号匹配问题)
题目描述:给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。示例 1:输入:s = "()"输出:true示例 2:输入:s = "()[]{}"输出:true示例 3:输入:s = "(]"输出:false示例 4:输入:s = "([)]"输出:false题目来源:leetCode 20. 有效的括号JavaScript的入栈是用原创 2021-11-07 16:17:34 · 386 阅读 · 0 评论 -
前端必备数据结构:快速排序,两种不同思路解答,必会
实现思路:将数组的最后一个数字作为基准,最后使得基准数字位于数组中间某个位置,它的左边的数字都比它小,它的右边的数字都比它大。细节:设置两个分别指向数组头部和尾部的指针i和j,首先向左移动j,使得array[j] 小于基准。然后向右移动i,使得array[i] 大于基准,交换这两个元素。当i 和j 的值相等时,交换基准与位置i上的元素,然后递归对i左边以及右边的元素分别进行快速排序。具体代码实现:var quickSort = function(arr) { if (arr.length <原创 2021-11-03 14:41:21 · 882 阅读 · 2 评论 -
前端必备数据结构:(栈)删除字符串中的所有相邻重复项
题目来源:leetCode 1047. 删除字符串中的所有相邻重复项题目描述 :给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。在 S 上反复执行重复项删除操作,直到无法继续删除。在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。示例:输入:"abbaca"输出:"ca"解释:例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca",其中又只有 "aa原创 2021-11-23 11:39:59 · 206 阅读 · 0 评论 -
前端必备数据结构:(栈)用正则奇妙解决的算法问题:解压缩字符串
题目描述:小Q想要给他的朋友发送一个神秘字符串,但是他发现字符串的过于长了,于是小Q发明了一种压缩算法对字符串中重复的部分进行了压缩,对于字符串中连续的m个相同字符串S将会压缩为m|S,例如字符串ABCABCABC将会被压缩为[3|ABC],现在小Q的同学收到了小Q发送过来的字符串,你能帮助他进行解压缩么?输入例子1:"HG[3|B[2|CA]]F"输出例子1:"HGBCACABCACABCACAF"例子说明1:HG[3|B[2|CA]]F−>HG[3|BCACA]F−>HGB原创 2021-11-09 00:29:22 · 253 阅读 · 0 评论 -
前端必备数据结构:(单向链表)反转链表
题目来源:leetcode 206. 反转链表题目描述:给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。输入:head = [1,2,3,4,5]输出:[5,4,3,2,1]思路描述:由上图可以看出,反转链表的核心是交换 cur 和 cue.next但是因为是单项链表,所有没有前指针,我们可以自己定义一个,pre = null, 把他初始化为1 的前指针 null。cur为1 ,cur.next 为 2,交换他们的值就是 cue.next = pre // 前指原创 2021-11-15 20:38:43 · 588 阅读 · 0 评论 -
前端必备数据结构:(单向链表) 删除链表中重复的数据
题目来源:leetcode 83. 删除排序链表中的重复元素题目描述:存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次 。返回同样按升序排列的结果链表。示例1 :输入:head = [1,1,2,3,3]输出:[1,2,3]思路描述:如果head 没有值或者空值则直接返回 head 。 if(!head) return head为什么要使用 let node = head ,是因为head不断递增为下一个节点的话,he原创 2021-11-15 16:45:40 · 199 阅读 · 0 评论