前端算法和数据结构
前端算法和数据结构学习中的一些小零碎。
帅帅邬同学
星辰和大海都需要门票,诗和远方的路费也都很贵,就好像我稍不努力连情怀都养不起!
展开
-
JavaScript实现 - LeetCode刷题 -【寻找数组的中心索引】- 第 724 题 !!!
题目:LeetCode题目链接题目截图:解题步骤:1.求出数组中所有元素之和2.遍历整个数组,如果 sum 减去当前元素和当前元素的左半部分之和 left, 结果等于左半部分之和,返回当前元素的下标,否则返回 -1代码:/** * @param {number[]} nums * @return {number} */var pivotIndex = function (nums) { let sum = 0; let left = 0; nums.forEach(原创 2021-01-29 12:44:21 · 153 阅读 · 4 评论 -
JavaScript实现 - LeetCode刷题 -【子集】- 第 78 题 !!!
题目:LeetCode题目链接题目截图:解题步骤:使用回溯算法,和全排列问题类似要求:1.所有子集 2.没有重复元素和重复子集;有出路、有死路;考虑使用回溯算法1.用递归模拟出所有情况2.保证接的数字都是后面的数字,是有顺序的(1后面可以跟2、3,但是3后面不可以跟1、2)3.收集所有到达递归终点的情况,并返回代码:/** * @param {number[]} nums * @return {number[][]} */var subsets = function (num原创 2021-01-29 11:27:10 · 224 阅读 · 4 评论 -
JavaScript实现 - LeetCode刷题 -【全排列】- 第 46 题 !!!
题目:LeetCode题目链接题目截图:解题步骤:使用回溯算法1.用递归模拟出所有情况2.遇到包含重复元素的情况,就回溯3.收集所有到达递归终点的情况,并返回代码:/** * @param {number[]} nums * @return {number[][]} */var permute = function(nums) { const res = []; const backtrack = path => { if (path.length ===原创 2021-01-28 22:06:19 · 202 阅读 · 2 评论 -
JavaScript实现 - LeetCode刷题 -【买卖股票的最佳时机 II】- 第 122 题 !!!
题目:LeetCode题目链接题目截图:解题步骤:使用贪心算法,只顾眼前,先追求局部最优解,然后发现它也是全局最优解,符合题意前提:上帝视角,知道未来的价格局部最优:见好就收,见差就不动,不作任何长远打算,并且这个利润还不是净利润(不减本钱),并且还不需要考虑能不能买得起这个问题,只是计算付出和挣取之间的差价而已1.新建一个变量,用来统计总利润2.遍历价格数组,如果当前价格比昨天高(所以i从1开始),就在昨天买,今天卖,否则就不交易3.遍历结束后,返回所有利润之和代码:/**原创 2021-01-26 22:00:41 · 293 阅读 · 2 评论 -
JavaScript实现 - LeetCode刷题 -【分发饼干】- 第 455 题 !!!
题目:LeetCode题目链接题目截图:解题步骤:用到了贪心算法局部最优:既能满足孩子,还消耗最少,这样就有可能满足更多的孩子1.对饼干数组和胃口数组升序排序2.遍历饼干数组,找到能满足第一个孩子的饼干3.然后继续遍历饼干数组,找到满足第二、三、...n个孩子的饼干,此时n就是能满足的孩子的最大值代码:/** * @param {number[]} g * @param {number[]} s * @return {number} */var findContentChi原创 2021-01-25 22:03:27 · 232 阅读 · 7 评论 -
JavaScript实现 - LeetCode刷题 -【打家劫舍】- 第 198 题 !!!
题目:LeetCode题目链接题目截图:解题步骤:符合动态规划的思想1.定义子问题:f(k) = max(f(k-2) + Ak, f(k-1)) f(k):从前k个房屋中能偷窃到的最大数额 Ak:第k个房屋的钱数,不是A乘k,A只是一个符号2.反复执行:从2循环到n,执行上述公式代码:/** * @param {number[]} nums * @return {number} */var rob = function (nums) { // 第一种方式 //原创 2021-01-25 21:43:16 · 196 阅读 · 4 评论 -
JavaScript实现 - LeetCode刷题 -【爬楼梯】- 第 70 题 !!!
题目:LeetCode题目链接题目截图:解题步骤:符合动态规划的思想1.定义子问题:爬到第n阶可以在第n-1阶爬一个台阶,或者在第n-2阶 爬两个台阶,由于是或,所以是+,F(n)表示爬到第n阶,所有的方法数 F(n) = F(n - 1) + F(n - 2)2.反复执行:从2循环到n,执行上述公式,因为n为1的话,只有一种方式代码:/** * @param {number} n * @return {number} */var climbStairs = functi原创 2021-01-23 21:40:13 · 2005 阅读 · 10 评论 -
JavaScript实现 - LeetCode刷题 -【对称二叉树】- 第 101 题 !!!
题目:LeetCode题目链接题目截图:解题步骤:符合分而治之的特点1.分:获取两个树的左子树和右子树2.解:递归地判断树1的左子树和树2的右子树是否镜像,树1的右子树和树2的左子树是否镜像3.合:如果上述都成立,且根节点值也相同,两个树就镜像代码:/** * Definition for a binary tree node. * function TreeNode(val) { * this.val = val; * this.left = this.rig原创 2021-01-23 21:08:44 · 109 阅读 · 2 评论 -
JavaScript实现 - LeetCode刷题 -【相同的树】- 第 100 题 !!!
题目:LeetCode题目链接题目截图:解题步骤:符合分而治之的特点1.分:获取两个数的左子树和右子树2.解:递归地判断两个树的左子树是否相同,右子树是否相同3.合:将上述结果合并,如果根节点的值也相同,则树就相同代码:/** * Definition for a binary tree node. * function TreeNode(val, left, right) { * this.val = (val===undefined ? 0 : val) *原创 2021-01-21 22:33:51 · 114 阅读 · 0 评论 -
JavaScript实现 - LeetCode刷题 -【翻转二叉树】- 第 226 题 !!!
题目:LeetCode题目链接题目截图:解题步骤:符合分而治之的特点1.分:获取左右子树2.解:递归地翻转(旋转180度)左右子树3.合:将翻转后的左右子树换个位置放到根节点上代码:/** * Definition for a binary tree node. * function TreeNode(val) { * this.val = val; * this.left = this.right = null; * } *//** * @param原创 2021-01-21 22:17:30 · 218 阅读 · 4 评论 -
JavaScript实现 - LeetCode刷题 -【猜数字大小】- 第 374 题 !!!
题目:LeetCode题目链接题目截图:解题步骤:用到了二分搜索1.从数组的中间元素开始,如果中间元素正好是目标值,则搜索过程结束2.如果目标值大于或者小于中间元素,则在数组大于或小于中间元素的那一半查找代码:/** * Forward declaration of guess API. * @param {number} num your guess * @return -1 if num is lower than the guess numbe原创 2021-01-21 22:00:24 · 281 阅读 · 7 评论 -
JavaScript实现 - LeetCode刷题 -【合并两个有序链表】- 第 21 题 !!!
题目:LeetCode题目链接题目截图:解题步骤:跟归并排序合并两个有序数组类似1.新建一个新链表,作为返回结果2.用指针遍历两个有序链表,并比较两个链表的当前节点, 较小者先接入新链表,并将指针后移一步3.链表遍历结束,返回新链表代码:/** * Definition for singly-linked list. * function ListNode(val, next) { * this.val = (val===undefined ? 0 : val) *原创 2021-01-18 21:53:28 · 239 阅读 · 3 评论 -
JavaScript实现 - LeetCode刷题 -【合并K个升序链表】- 第 23 题 !!!
题目:LeetCode题目链接题目截图:解题步骤:1.构建一个最小堆,并依次把链表头插入堆中,但需要对最小堆有所改动2.弹出最小的堆顶接到输出链表,并将之前弹出的堆顶所在链表的新链表头,插入堆中3.重复第二步,等堆元素全部弹出,合并工作就完成了代码:// 最小堆class MinHeap { constructor() { this.heap = []; } // 交换 swap(i1, i2) { const temp = this.heap[i1];原创 2021-01-17 21:26:01 · 215 阅读 · 6 评论 -
举例说明子串和子序列的区别 !!!
定义:子串:必须连续子序列:可以不连续举个栗子给定字符串 "asdfghj"子串是asd,asdf等很多个子串, 是连在一起的。子序列是 asf,adf等很多个子序列 ,子序列中的字符在字符串中不一定是连在一起的。怎么样,是不是很简单,你学会了吗 ?如果这篇文章能够帮助到您,希望您不要吝惜点赞 ???????? 和收藏 ????????,您的支持是我继续努力的动力 ????????!!!...原创 2021-01-16 21:10:38 · 6039 阅读 · 2 评论 -
JavaScript实现 - LeetCode刷题 -【前 K 个高频元素】- 第 347 题 !!!
题目:LeetCode题目链接题目截图:解题步骤:1.构建一个最小堆,并依次把数组的值插入堆中2.当堆的容量超过K,就删除堆顶3.插入结束后,堆顶就是第K个最大元素,就比如只剩下三个元素了,则堆顶就是第三个最大元素代码:// 最小堆class MinHeap { constructor() { this.heap = []; } // 交换 swap(i1, i2) { const temp = this.heap[i1]; this.heap[原创 2021-01-16 20:20:48 · 196 阅读 · 0 评论 -
JavaScript实现 - LeetCode刷题 -【数组中的第K个最大元素】- 第 215 题 !!!
题目:LeetCode题目链接题目截图:解题步骤:1.构建一个最小堆,并依次把数组的值插入堆中2.当堆的容量超过K,就删除堆顶3.插入结束后,堆顶就是第K个最大元素,就比如只剩下三个元素了,则堆顶就是第三个最大元素代码:// 最小堆class MinHeap { constructor() { this.heap = []; } // 交换 swap(i1, i2) { const temp = this.heap[i1]; this.heap[原创 2021-01-16 19:33:52 · 140 阅读 · 0 评论 -
JavaScript实现 - LeetCode刷题 -【克隆图】- 第 133 题 !!!
题目:LeetCode题目链接题目截图:解题步骤:1.深度或广度优先遍历所有节点 2.拷贝所有的节点,存储起来3.将拷贝的节点,按照原图的连接方法进行连接代码:/** * // Definition for a Node. * function Node(val, neighbors) { * this.val = val === undefined ? 0 : val; * this.neighbors = neighbors === und原创 2021-01-14 21:05:57 · 142 阅读 · 2 评论 -
JavaScript实现 - LeetCode刷题 -【太平洋大西洋水流问题】- 第 417 题 !!!
题目:LeetCode题目链接题目截图:解题步骤:1.新建两个矩阵,分别记录能流到两个大洋的坐标2.从海岸线,多管齐下,同时深度优先遍历图,过程中填充上述矩阵3.遍历上面两个矩阵,找出同时能流到两个大洋的坐标代码:/** * @param {number[][]} matrix * @return {number[][]} */var pacificAtlantic = function (matrix) { if (!matrix || !matrix[0]) return原创 2021-01-13 22:22:30 · 179 阅读 · 0 评论 -
JavaScript实现 - LeetCode刷题 -【有效数字】- 第 65 题 !!!
题目:LeetCode题目链接题目截图:解题步骤:1.构建一个表示状态的图,0-7一共表示8种状态,3/5/6是合法状态2.遍历字符串,并沿着图走,如果到了某个节点无路可走就返回false3.遍历结束,如走到3/5/6,就返回true,否则返回false代码:/** * @param {string} s * @return {boolean} */var isNumber = function (s) { const graph = { 0: { 'blank':原创 2021-01-12 22:17:03 · 115 阅读 · 4 评论 -
JavaScript实现 - LeetCode刷题 -【路径总和】- 第 112 题 !!!
题目:LeetCode题目链接题目截图:解题步骤:1.深度优先遍历二叉树,在叶子节点处,判断当前路径的节点值的和是否等于目标值,是就返回true2.遍历结束,如果没有匹配,就返回false代码:/** * Definition for a binary tree node. * function TreeNode(val) { * this.val = val; * this.left = this.right = null; * } *//** * @pa原创 2021-01-11 22:06:22 · 177 阅读 · 0 评论 -
JavaScript实现 - LeetCode刷题 -【二叉树的中序遍历】- 第 94 题 !!!
题目:LeetCode题目链接题目截图:解题步骤:1.对根节点的左子树进行中序遍历2.访问根节点3.对根节点的右子树进行中序遍历代码:/** * Definition for a binary tree node. * function TreeNode(val, left, right) { * this.val = (val===undefined ? 0 : val) * this.left = (left===undefined ? null : left原创 2021-01-10 22:25:05 · 87 阅读 · 0 评论 -
JavaScript实现 - LeetCode刷题 -【二叉树的层序遍历】- 第 102 题 !!!
题目:LeetCode题目链接题目截图:解题步骤:1.广度优先遍历二叉树2.遍历过程中,记录每个节点的层级,并将其添加到不同的数组中代码:/** * Definition for a binary tree node. * function TreeNode(val) { * this.val = val; * this.left = this.right = null; * } *//** * @param {TreeNode} root * @retu原创 2021-01-09 17:55:19 · 207 阅读 · 0 评论 -
JavaScript实现 - LeetCode刷题 -【二叉树的最小深度】- 第 111 题 !!!
题目:LeetCode题目链接题目截图:解题步骤:1.广度优先遍历整棵树,并记录每个节点的层级2.遇到叶子节点,返回节点层级,并停止遍历代码:/** * Definition for a binary tree node. * function TreeNode(val, left, right) { * this.val = (val===undefined ? 0 : val) * this.left = (left===undefined ? null : l原创 2021-01-08 22:29:42 · 181 阅读 · 3 评论 -
JavaScript实现 - LeetCode刷题 -【二叉树的最大深度】- 第 104 题 !!!
题目:LeetCode题目链接题目截图:解题步骤:1.新建一个变量,记录最大深度2.深度优先遍历整棵树,并记录每个节点的层级,同时不断刷新最大深度这个变量3.遍历结束返回最大深度这个变量代码:/** * Definition for a binary tree node. * function TreeNode(val) { * this.val = val; * this.left = this.right = null; * } *//** * @pa原创 2021-01-07 09:36:58 · 156 阅读 · 4 评论 -
JavaScript实现 - LeetCode刷题 -【最小覆盖子串】- 第 76 题 !!!
题目:LeetCode题目链接题目截图:解题步骤:1.用双指针维护一个滑动窗口2.移动右指针,找到包含t的子串,移动左指针,尽量减少包含t的子串的长度3.循环上述过程,找出包含t的最小子串代码:/** * @param {string} s * @param {string} t * @return {string} */var minWindow = function (s, t) { let l = r = 0; const need = new Map();原创 2021-01-06 08:04:57 · 148 阅读 · 0 评论 -
JavaScript实现-LeetCode刷题-【无重复字符的最长子串】-第3题 !!!
题目:LeetCode题目链接题目截图:解题步骤:1.用双指针维护一个滑动窗口,用来剪切子串2.不断移动右指针,遇到重复字符,就把左指针移动到重复字符的下一位 3.过程中,记录所有窗口的长度,并返回最大值代码:/** * @param {string} s * @return {number} */var lengthOfLongestSubstring = function (s) { let l = 0; // 左原创 2021-01-05 09:04:00 · 293 阅读 · 2 评论 -
JavaScript实现-LeetCode刷题-【两数之和】-第1题!!!
题目:LeetCode题目链接题目截图:解题步骤:1.新建一个字典作为婚姻介绍所2.nums里的值,逐个来介绍所找对象,没有合适的就先登记着,有合适的就牵手成功注意:题目中的"你可以假设每种输入只会对应一个答案",就表明了数组中的元素不会重复代码:/** * @param {number[]} nums * @param {number} target * @return {number[]} */var twoSum = function (nums, target) {原创 2021-01-04 11:06:38 · 182 阅读 · 0 评论 -
JavaScript实现-LeetCode刷题-【 两个数组的交集】-第349题!!!
题目:LeetCode题目链接题目截图:解题步骤:第一种方式,使用集合:1.用集合对nums1去重2.遍历nums1,筛选出nums2也包含的值第二种方式,使用字典:1.新建一个字典,遍历nums1,填充字典2.遍历nums2,遇到字典里的值就选出,并从字典中删除,防止重复代码:/** * @param {number[]} nums1 * @param {number[]} nums2 * @return {number[]} */var intersection =原创 2021-01-03 21:08:16 · 250 阅读 · 0 评论 -
JavaScript实现-LeetCode刷题-【 环形链表】-第141题!!!
题目:LeetCode题目链接题目截图:解题步骤:1. 用一快一慢两个指针遍历链表,如果指针能够相逢,就返回 true,表示能够形成一个环2. 遍历结束后,还没有相逢就返回 false代码:/** * Definition for singly-linked list. * function ListNode(val) { * this.val = val; * this.next = null; * } *//** * @param {ListNode}原创 2021-01-02 11:12:04 · 611 阅读 · 2 评论 -
JavaScript实现-LeetCode刷题-【 删除排序链表中的重复元素】-第83题!!!
题目:LeetCode题目链接题目截图:解题步骤:1.遍历链表,如果发现当前元素和下个元素值相同,就删除下个元素值2.遍历结束后,返回原链表的头部代码:/** * Definition for singly-linked list. * function ListNode(val) { * this.val = val; * this.next = null; * } *//** * @param {ListNode} head * @return {Li原创 2021-01-01 11:52:37 · 1939 阅读 · 7 评论 -
JavaScript实现-LeetCode刷题-【 两数相加】-第2题!!!
题目:LeetCode题目链接题目截图:解题步骤:1.新建一个空链表2.遍历被相加的两个链表,模拟相加操作,将个位数追加到新链表上,将十位数留到下一位去相加代码:/** * Definition for singly-linked list. * function ListNode(val, next) { * this.val = (val===undefined ? 0 : val) * this.next = (next===undefined ? null原创 2020-12-31 19:27:14 · 361 阅读 · 3 评论 -
JavaScript实现-LeetCode刷题-【 反转链表】-第206题!!!
题目:LeetCode题目链接题目截图:解题步骤:使用双指针,p1指向头结点,p2在p1前面,初始值为null1.双指针一前一后遍历链表2.反转双指针代码:/** * Definition for singly-linked list. * function ListNode(val) { * this.val = val; * this.next = null; * } *//** * @param {ListNode} head * @return原创 2020-12-30 11:45:27 · 334 阅读 · 0 评论 -
JavaScript实现-LeetCode刷题-【 删除链表中的节点】-第237题!!!
题目:LeetCode题目链接题目截图:解题步骤:由于我们只能得到链表的下个节点的值,不能得到链表的上个节点的值,所以只能采用下面的方式:1.将被删除节点的值改为下个节点的值2.删除下个节点代码:/** * Definition for singly-linked list. * function ListNode(val) { * this.val = val; * this.next = null; * } *//** * @param {ListNo原创 2020-12-29 11:20:21 · 238 阅读 · 4 评论 -
JavaScript实现-LeetCode刷题-【最近的请求次数】-第933题!!!
题目:LeetCode题目链接题目截图:解题步骤:1.有新请求就入队,3000毫秒前发出的请求(即不在范围内的请求)出队2.队列的长度就是最近请求次数代码:var RecentCounter = function () { this.q = [];};/** * @param {number} t * @return {number} */RecentCounter.prototype.ping = function (t) { this.q.push(t);原创 2020-12-28 12:32:50 · 267 阅读 · 2 评论 -
JavaScript实现-LeetCode刷题-【有效的括号】-第20题!!!
题目:LeetCode题目链接题目截图:解题步骤:1.新建一个栈2.扫描字符串,遇左括号入栈,遇到和栈顶括号类型匹配的右括号就出栈, 类型不匹配直接判定为不合法3.最后栈空了就合法,否则不合法代码:// 第一种方式var isValid = function (s) { if (s.length % 2 === 1) return false; // 字符串的长度是奇数 const stack = []; for (let i = 0; i < s.length原创 2020-12-27 17:15:05 · 264 阅读 · 0 评论 -
JavaScript实现-LeetCode刷题-【对称二叉树】-第101题!!!
题目:LeetCode题目链接题目截图:解题步骤:符合分而治之的特点1.分:获取两个树的左子树和右子树2.解:递归地判断树1的左子树和树2的右子树是否镜像,树1的右子树和树2的左子树是否镜像3.合:如果上述都成立,且根节点值也相同,两个树就镜像代码:/** * Definition for a binary tree node. * function TreeNode(val) { * this.val = val; * this.left = this.rig原创 2020-12-26 17:56:56 · 266 阅读 · 4 评论 -
JavaScript实现-LeetCode刷题-【相同的树】-第100题!!!
前言:“吾日三省吾身”,出自《论语·学而》。曾子在回答孔子提问时说:“吾日三省吾身:为人谋而不忠乎?与朋友交而不信乎?传不习乎?”曾子每天都多次自觉省察自己,查看为别人做的事是否尽心竭力,与朋友交往是否诚心诚意,老师传授的学业是否温习了。要想成为一名合格的前端程序员,我们就得有一个持续学习的好习惯,索性我们就用一题对应一省,不积跬步无以至千里,不积细流无以成江海,坚持的力量是巨大的,每日三题,不多也不少,我会努力做到每天更新,希望能和大家一起坚持下去,互相监督,一起成为更厉害的大人和更可爱的小孩啊!原创 2020-12-26 16:39:08 · 251 阅读 · 4 评论 -
JavaScript实现:快速排序!!!
快速排序的思路:分区:从数组中任意选择一个“基准”,所有比基准小的元素放在基准前面,比基准大的元素放在后面递归:递归地对基准前后的子数组进行分区排序动画地址:排序动画话不多说,上代码!!!Array.prototype.quickSort = function () { const rec = (arr) => { if (arr.length === 1) return arr; const left = []; const right = [];原创 2020-12-23 20:56:26 · 184 阅读 · 4 评论 -
JavaScript实现:归并排序!!!
归并排序的思路:分:把数组劈成两半,再递归地对子数组进行‘分’操作,直到分成一个个单独的数合:把两个数合并为有序数组,再对有序数组进行合并,直到全部子数组合并为一个完整数组合并两个有序数组的步骤:新建一个空数组res,用于存放最终排序后的数组比较两个有序数组的头部,较小者出队并推入res中如果两个数组还有值,就重复第二步(说明是一个循环)排序动画地址:排序动画话不多说,上代码!!!Array.prototype.mergeSort = function () { const原创 2020-12-23 20:52:49 · 130 阅读 · 0 评论 -
JavaScript实现:插入排序!!!
插入排序的思路(原理就跟打牌的时候,揭牌并整理牌):从第二个数开始往前比比它大就往后排以此类推进行到最后一个数排序动画地址:排序动画话不多说,上代码!!!Array.prototype.insertionSort = function () { for (let i = 1; i < this.length; i++) { const temp = this[i]; let j = i; while (j > 0) { if (this[原创 2020-12-23 20:48:08 · 286 阅读 · 0 评论