数据结构
文章平均质量分 86
CaseyWei
感激每个遇见的人
展开
-
(转)PHP+Redis+MySQL解决商品秒杀与超卖
这个是实体店我们会看到的场景,100件商品,1人1件,最后200人中只有100人能买到商品,剩下100人只能空手而归。如果您开了家网店,同样你开起了秒杀的活动,可能同时会有1000人通过不同的终端访问你的商品秒杀活动页面,你的商品可以会在瞬间秒杀完毕,库存清零。可是如果网店秒杀活动程序设计出问题,会导致秒杀库存超卖的现象,比如100件库存,实际订单有120件,原因就处在并发同时程序处理的问题上。其实我们也可以采取排队限购的办法解决网店秒杀活动商品超卖的问题。今天我们给大家讲解采用PHP+Redis+My原创 2021-06-30 19:49:47 · 426 阅读 · 0 评论 -
选择排序(JavaScript版)
实例:Array.prototype.selectionSort = function () { for (let i = 0; i < this.length - 1; i += 1) { let indexMin = i; for (let j = i; j < this.length; j_ = 1) { if (this[j] < this[indexMin]) { indexMin = j; } } .原创 2020-12-01 09:04:23 · 165 阅读 · 0 评论 -
冒泡排序(JavaScript版)
Array.prototype.bubbleSort = function () { for (let i = 0; j < this.length - 1; i += 1) { for (let j = 0; j < this.length - 1 - i; j += 1) { if (this[j] > this[j + 1]) { const temp = this[j]; this[j] = this[j + 1]; .原创 2020-11-30 10:37:11 · 183 阅读 · 0 评论 -
23. 合并K个升序链表(JavaScript版)
题目:给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。示例 1:输入:lists = [[1,4,5],[1,3,4],[2,6]]输出:[1,1,2,3,4,4,5,6]解释:链表数组如下:[ 1->4->5, 1->3->4, 2->6]将它们合并到一个有序链表中得到。1->1->2->3->4->4->5->6示例 2:输入:li...原创 2020-11-30 10:16:12 · 470 阅读 · 1 评论 -
347. 前 K 个高频元素(JavaScript版)
题目:给定一个非空的整数数组,返回其中出现频率前k高的元素。示例 1:输入: nums = [1,1,1,2,2,3], k = 2输出: [1,2]示例 2:输入: nums = [1], k = 1输出: [1]提示:你可以假设给定的k总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。你的算法的时间复杂度必须优于 O(n log n) ,n是数组的大小。题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的。你可以按任意顺...原创 2020-11-27 09:12:26 · 529 阅读 · 0 评论 -
215. 数组中的第K个最大元素(JavaScript版)
题目:在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。示例 1:输入: [3,2,1,5,6,4] 和 k = 2输出: 5示例2:输入: [3,2,3,1,2,4,5,5,6] 和 k = 4输出: 4说明:你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。解题:class MinHeap{ constructor() { this.heap = [] } //.原创 2020-11-27 08:13:42 · 310 阅读 · 0 评论 -
JavaScript 实现:最小堆类
class MinHeap{ constructor() { this.heap = [] } // 替换两个节点值 swap(i1,i2){ const temp = this.heap[i1]; this.heap[i1] = this.heap[i2]; this.heap[i2] = temp; } // 获取父节点 getParentIndex() { return (i -1) >> 1; //求除2的商 }.原创 2020-11-26 10:10:43 · 1019 阅读 · 3 评论 -
数据结构——堆
堆的:1.堆是一种特殊的完全二叉树2.所有的节点都大于等于(最大堆)或小于等于(最小堆)它的子节点。最大堆:图例:最小堆:图例:js中的堆:1.js中通常用数组表示堆。2.左侧子节点的位置是2*index+1。3.右侧子节点的位置是2*index+2。4.父节点位置是(index-1)/2图例:堆的应用:1.堆能高效、快速地找出最大值和最小值,时间复杂度:0(1)。2.找出第k个最大(小)元素。第k个最大(小)元素解题思路:.原创 2020-11-26 08:48:29 · 239 阅读 · 1 评论 -
(转)图的表示法与常用的转化算法
《图的表示方法》(i)邻接矩阵表示法,如图: 也就是说,如果两节点之间有一条弧,则邻接矩阵中对应的元素为1;否则为0。可以看出,这种表示法非常简单、直接。但是,在邻接矩阵的所有 个元素中,只有 个为非零元。如果网络比较稀疏,这种表示法浪费大量的存储空间,从而增加了在网络中查找弧的时间。 同样,对于网络中的权,也可以用类似邻接矩阵的 矩阵表示。只是此时一条弧所对应的元素不再是1,而是相应的权而已。如果网络中每条弧赋有多种权,则可以用多个矩阵表示这些权。(ii)关联矩阵表示法 .原创 2020-11-25 11:23:06 · 366 阅读 · 0 评论 -
65. 有效数字(JavaScript版)
题目:验证给定的字符串是否可以解释为十进制数字。例如:"0"=>true" 0.1 "=>true"abc"=>false"1 a"=>false"2e10"=>true" -90e3"=>true" 1e"=>false"e3"=>false" 6e-1"=>true" 99e2.5"=>false"53.5e93"=>true" --6 "=>...原创 2020-11-24 09:20:51 · 305 阅读 · 1 评论 -
图的深度优先遍历和广度优先遍历(JavaScript版)
1.深度优先遍历:算法口诀:1.访问根节点。2.对根节点的没访问过的相邻节点挨个进行深度优先遍历。实例:const graph = { 0: [1,2], 1: [2], 2:[0,3], 3: [3]}const visited = new Set();const dfs = (n) => { console.log(n); visited.add(n); graph[n].forEach(c=> { if(!visited原创 2020-11-24 09:03:32 · 365 阅读 · 0 评论 -
遍历 JSON 的所有节点值
const json = { a: { b: { c: 1 } }, d: [1, 2]}const dfs = (n, path) => { console.log(n, path); Object.keys(n).forEach(k => { dfs(n[k], path.concat(k)); })}dfs(json, []);原创 2020-11-23 09:59:10 · 804 阅读 · 0 评论 -
112. 路径总和(JavaScript版)
题目:给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。说明:叶子节点是指没有子节点的节点。示例:给定如下二叉树,以及目标和 sum = 22, 5 / \ 4 8 / / \ 11 13 4 / \ \ 7 2 1返回 true, 因为存...原创 2020-11-20 08:46:41 · 257 阅读 · 0 评论 -
102. 二叉树的层序遍历(JavaScript版)
题目:给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。示例:二叉树:[3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回其层次遍历结果:[ [3], [9,20], [15,7]]解题:var levelOrder = function (root) { if(!root) return []; const q =[root];...原创 2020-11-19 20:25:01 · 345 阅读 · 0 评论 -
111. 二叉树的最小深度(JavaScript版)
题目:给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明:叶子节点是指没有子节点的节点。示例 1:输入:root = [3,9,20,null,null,15,7]输出:2示例 2:输入:root = [2,null,3,null,4,null,5,null,6]输出:5提示:树中节点数的范围在[0, 105]内 -1000 <= Node.val <= 1000解题:var ...原创 2020-11-18 11:39:52 · 364 阅读 · 0 评论 -
二叉树的最大深度(JavaScript版)
题目:给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明:叶子节点是指没有子节点的节点。示例:给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回它的最大深度3 。解题:var maxDepth = function (root) { let res = 0; const dfs = (n, l) => { if (!...原创 2020-11-16 20:18:36 · 636 阅读 · 0 评论 -
二叉树的先中后序遍历(JavaScript非递归版)
1.先序遍历:const preorder = (root) => { if (!root) { return; } const stack = [root]; while (stack.length) { const n = stack.pop(); console.log(n.val); if (n.right) stack.push(n.right); if (n.left) stack.push(n.left); }}preorde原创 2020-11-16 08:56:12 · 234 阅读 · 1 评论 -
二叉树的先中后序遍历(JavaScript版)
1.先序遍历:先序遍历算法口诀:1.访问根节点2.对根节点的左子树进行先序遍历3.对根节点的右子树进行先序遍历实例:const bt = { val: 1, left: { val: 2, left: { val: 4, left: null, right: null }, right: { val: 5, left: null, right: { v原创 2020-11-13 18:31:35 · 245 阅读 · 0 评论 -
树的深度优先遍历和广度优先遍历(JavaScript版)
1.深度优先遍历:深度优先遍历:尽可能深的搜索树的分支。例如:算法口诀:1.访问根节点。2.对根节点的children挨个进行深度优先遍历。实例:2.广度优先遍历:广度优先遍历:先访问离根节点最近的节点。例如:...原创 2020-11-13 17:51:51 · 678 阅读 · 1 评论 -
76. 最小覆盖子串(JavaScript版)
题目:给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" 。注意:如果 s 中存在这样的子串,我们保证它是唯一的答案。示例 1:输入:s = "ADOBECODEBANC", t = "ABC"输出:"BANC"示例 2:输入:s = "a", t = "a"输出:"a"提示:1 <= s.length, t.length <= 105s 和 t 由英文字..原创 2020-11-12 20:10:18 · 399 阅读 · 0 评论 -
3. 无重复字符的最长子串(JavaScript版)
解题:给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。示例1:输入: "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2:输入: "bbbbb"输出: 1解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。示例 3:输入: "pwwkew"输出: 3解释: 因为无重复字符的最长子串是"wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke"...原创 2020-11-12 19:51:04 · 143 阅读 · 0 评论 -
1. 两数之和(JavaScript版)
题目:给定一个整数数组 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 = ...原创 2020-11-11 09:36:44 · 679 阅读 · 1 评论 -
349. 两个数组的交集(JavaScript版)
题目:给定两个数组,编写一个函数来计算它们的交集。示例 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(nu..原创 2020-11-11 09:11:55 · 227 阅读 · 0 评论 -
141. 环形链表(JavaScript版)
题目:给定一个链表,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。如果链表中存在环,则返回 true 。 否则,返回 false 。进阶:你能用 O(1)(即,常量)内存解决此问题吗?示例 1:输入:head..原创 2020-11-10 10:00:17 · 214 阅读 · 0 评论 -
83. 删除排序链表中的重复元素(JavaScript版)
题目:给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。示例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..原创 2020-11-10 09:29:27 · 163 阅读 · 0 评论 -
2. 两数相加(JavaScript版)
题目:给出两个非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0开头。示例:输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -> 8原因:342 + 465 = 807解题:var addTwoNumbers =...原创 2020-11-10 09:09:23 · 947 阅读 · 0 评论 -
206.反转链表(JavaScript版)
题目:定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL限制:0 <= 节点个数 <= 5000解题:var reverseList = function(head) { let p1 =head; let p2 = null; while(p1) {..原创 2020-11-10 08:41:47 · 112 阅读 · 0 评论 -
剑指 Offer 18. 删除链表的节点(JavaScript版)
给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。题目:注意:此题对比原题有改动示例 1:输入: head = [4,5,1,9], val = 5输出: [4,1,9]解释: 给定你链表中值为5的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.示例 2:输入: head = [4,5,1,9], val = 1输出: [4,5,9]解释: 给定你链表中值为1的第三个节点,那么在调用...原创 2020-11-09 08:48:50 · 148 阅读 · 0 评论 -
933. 最近的请求次数(JavaScript版)
题:写一个RecentCounter类来计算特定时间范围内最近的请求。请你实现 RecentCounter 类:RecentCounter() 初始化计数器,请求数为 0 。int ping(int t) 在时间 t 添加一个新请求,其中 t 表示以毫秒为单位的某个时间,并返回过去 3000 毫秒内发生的所有请求数(包括新请求)。确切地说,返回在 [t-3000, t] 内发生的请求数。保证每次对 ping 的调用都使用比之前更大的 t 值。示例 1:输入:["Rece...原创 2020-11-09 08:41:21 · 266 阅读 · 0 评论 -
20. 有效的括号(JavaScript版)
题目:给定一个只包括 '(',')','{','}','[',']'的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。示例 1:输入: "()"输出: true示例2:输入: "()[]{}"输出: true示例3:输入: "(]"输出: false示例4:输入: "([)]"输出: false示例5:输入: "{[]}"输出: true解:...原创 2020-11-07 15:18:20 · 809 阅读 · 0 评论 -
(转)JS中的算法与数据结构——链表(Linked-list)
链表(Linked-list)前面我们讨论了如何使用栈、队列进行存数数据,他们其实都是列表的一种,底层存储的数据的数据结构都是数组。但是数组不总是最佳的数据结构,因为,在很多编程语言中,数组的长度都是固定的,如果数组已被数据填满,再要加入新的元素是非常困难的。而且,对于数组的删除和添加操作,通常需要将数组中的其他元素向前或者向后平移,这些操作也是十分繁琐的。然而,JS中数组却不存在上述问题,主要是因为他们被实现了成了对象,但是与其他语言相比(比如C或Java),那么它的效率会低很多。这时候,原创 2020-09-11 17:20:45 · 169 阅读 · 0 评论