JS数据结构和算法
数据结构和算法
zpfnext
这个作者很懒,什么都没留下…
展开
-
数据结构之树:112. 路径总和
给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。说明: 叶子节点是指没有子节点的节点。示例: 给定如下二叉树,以及目标和 sum = 22,返回 true, 因为存在目标和为 22 的根节点到叶子节点的路径 5->4->11->2var hasPathSum = function(root, sum) { if(!root) return false let res = false const d原创 2020-10-06 14:08:29 · 93 阅读 · 0 评论 -
数据结构之树:94. 二叉树的中序遍历
给定一个二叉树,返回它的中序 遍历。示例:进阶: 递归算法很简单,你可以通过迭代算法完成吗?方法一:递归版var inorderTraversal = function(root) { const res = [] const rec = (n) => { if(!n) return rec(n.left) res.push(n.val) rec(n.right) } rec(root)原创 2020-10-06 13:26:42 · 72 阅读 · 0 评论 -
数据结构之树:102. 二叉树的层序遍历
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。示例:二叉树:[3,9,20,null,null,15,7],返回其层次遍历结果:var levelOrder = function(root) { const q = [[root,0]] const res = [] while(q.length) { const [n,l] = q.shift() if(!res[l]) {原创 2020-10-06 12:35:47 · 47 阅读 · 0 评论 -
数据结构之树:111. 二叉树的最小深度
给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明: 叶子节点是指没有子节点的节点。示例:给定二叉树 [3,9,20,null,null,15,7],返回它的最小深度 2.var minDepth = function(root) { if(!root) {return 0;}//0一定要加上,否者报错 const q = [[root,1]]; while(q.length) { const [n,l]原创 2020-10-06 00:57:57 · 50 阅读 · 0 评论 -
数据结构之树:104. 二叉树的最大深度
给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。示例:给定二叉树 [3,9,20,null,null,15,7],var maxDepth = function(root) { let res = 0; const dfs = (n,l) => { if(!n) {return;} if(!n.left&&!n.right) {原创 2020-10-06 00:39:39 · 52 阅读 · 0 评论 -
数据结构之字典:76. 最小覆盖子串
给你一个字符串 S、一个字符串 T 。请你设计一种算法,可以在 O(n) 的时间复杂度内,从字符串 S 里面找出:包含 T 所有字符的最小子串。示例:输入:S = "ADOBECODEBANC", T = "ABC"输出:"BANC"提示:如果 S 中不存这样的子串,则返回空字符串 ""。如果 S 中存在这样的子串,我们保证它是唯一的答案。var minWindow = function(s, t) { let l = 0; let r =0; const nee原创 2020-10-05 00:31:43 · 133 阅读 · 0 评论 -
数据结构之字典:20.有效的括号
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。//方法一:字典var isValid = function(s) { const stack = []; const map = { ')':'(', '}':'{', ']':'[' } for(let原创 2020-10-04 23:05:14 · 197 阅读 · 0 评论 -
数据结构之字典:3. 无重复字符的最长子串
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 示例 2:输入: "bbbbb"输出: 1解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。示例 3:输入: "pwwkew"输出: 3解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串原创 2020-10-04 00:10:51 · 120 阅读 · 0 评论 -
数据结构之字典:1. 两数之和
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]var twoSum = function(nums, target) { const map = new Map()原创 2020-10-03 23:07:57 · 112 阅读 · 0 评论 -
数据结构之字典:349. 两个数组的交集
给定两个数组,编写一个函数来计算它们的交集。示例 1:输入:nums1 = [1,2,2,1], nums2 = [2,2]输出:[2]示例 2:输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]输出:[9,4]说明:输出结果中的每个元素一定是唯一的。我们可以不考虑输出结果的顺序。var intersection = function(nums1, nums2) { const map = new Map() nums1.forEach原创 2020-10-03 22:15:13 · 88 阅读 · 0 评论 -
数据结构之集合:349. 两个数组的交集
给定两个数组,编写一个函数来计算它们的交集。示例 1:输入:nums1 = [1,2,2,1], nums2 = [2,2]输出:[2]示例 2:输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]输出:[9,4]说明:输出结果中的每个元素一定是唯一的。我们可以不考虑输出结果的顺序。方法一:var intersection = function(nums1, nums2) { return [...new Set(nums1)].filter(原创 2020-10-02 01:18:04 · 133 阅读 · 0 评论 -
数据结构之链表:141. 环形链表
给定一个链表,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。如果链表中存在环,则返回 true 。 否则,返回 false 。进阶:你能用 O(1)(即,常量)内存解决此问题吗?...原创 2020-10-01 09:42:32 · 396 阅读 · 0 评论 -
数据结构之链表:83. 删除排序链表中的重复元素
给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。示例 1:输入: 1->1->2输出: 1->2示例 2:输入: 1->1->2->3->3输出: 1->2->3方法一:var deleteDuplicates = function(head) { let p =head; while (p && p.next) { if(p.val===p.next.val){原创 2020-10-01 00:45:17 · 97 阅读 · 0 评论 -
数据结构之链表:206. 反转链表
反转一个单链表。 示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL进阶:你可以迭代或递归地反转链表。你能否用两种方法解决这道题?方法一var reverseList = function(head) { let p1 = head; let p2 = null; while(p1) { const temp = p1.next;原创 2020-09-30 01:00:47 · 99 阅读 · 0 评论 -
数据结构之链表:237. 删除链表中的节点
请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点。传入函数的唯一参数为 要被删除的节点 。现有一个链表 -- head = [4,5,1,9],它可以表示为:示例 1:输入:head = [4,5,1,9], node = 5输出:[4,1,9]解释:给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.示例 2:输入:head = [4,5,1,9], node = 1输出:[4,5,9]解释:给定你链表中值为 1原创 2020-09-30 00:47:29 · 122 阅读 · 0 评论 -
数据结构之队列:933.最近的请求次数
写一个 RecentCounter 类来计算最近的请求。它只有一个方法:ping(int t),其中 t 代表以毫秒为单位的某个时间。返回从 3000 毫秒前到现在的 ping 数。任何处于 [t - 3000, t] 时间范围之内的 ping 都将会被计算在内,包括当前(指 t 时刻)的 ping。保证每次对 ping 的调用都使用比之前更大的 t 值。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/number-of-recen原创 2020-09-21 09:43:28 · 65 阅读 · 0 评论 -
数据结构之栈:20.有效的括号
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。//方法一:栈var isValid = function(s) { if(s.length%2===1) {return false;} const stack=[]; for(let i=0; i<s.length; i++) { co原创 2020-09-18 23:42:02 · 103 阅读 · 0 评论