
算法
华洛
野生程序员,终身学习者。
展开
-
广搜与深搜分别遍历dom节点的——generator版本与普通版本双实现
使用jsdom来解析dom节点 import jsdom from 'jsdom' const dom = new jsdom.JSDOM(` <!DOCTYPE html> <body> <div> <div> <span></span> <span></span> </div> <input/>原创 2021-07-31 20:50:27 · 231 阅读 · 0 评论 -
leetcode第239题: 滑动窗口最大值——单调队列解法
单调队列 维护数据的单调性,队首元素超出窗口范围就出队,队首元素永远维护区间最值 不要跟二叉推搞混了,二叉堆是维护集合最值,单调队列是维护区间最值 使用单调队列求解 var maxSlidingWindow = function (nums, k) { let q = []; //维护单调队列 let ret = []; //结果数组 for(let i=0;i<nums.length;i++){ // 维护单调队列入队操作 while(q.len原创 2021-07-10 11:07:06 · 257 阅读 · 0 评论 -
LeetCode第993题:二叉树的堂兄弟节点——广搜解法+深搜解法
DFS解法(深搜) var isCousins = function (root, x, y) { let d1, d2, father_x = {}, father_y = {}; d1 = dfs(root, x, father_x) d2 = dfs(root, y, father_y) return (d1 == d2 && father_x.val != father_y.val) }; dfs = (root, x, father) => { if (原创 2021-06-20 11:40:18 · 220 阅读 · 0 评论 -
使用队列实现一个异步任务逐一执行的功能
使用队列实现一个异步任务逐一执行的功能 // 简单搞一个队列 class Queue { constructor() { this.arr = []; this.head = 0; this.tail = 0; } push(x) { this.arr.push(x); this.tail++; } top() { return this.arr[this.head]; } pop()原创 2021-05-14 11:21:07 · 452 阅读 · 0 评论 -
手动实现一个二叉推、优先队列
二叉推的实现 // 堆的实现,传入big是大顶堆,small是小顶堆 class Heap { constructor(type = "big") { this.type = type; this.arr = []; // 堆的存储空间 this.count = 0; } push(n) { this.arr[this.count++] = n; // 大顶堆 let index = this.count - 1; if (this.typ原创 2021-04-12 12:53:50 · 138 阅读 · 0 评论 -
LeetCode第1249题: 移除无效的括号
首先要手动实现一个栈 MyStack class MyStack { constructor() { this.arr = []; } push(val) { this.arr.push(val) } pop() { if (this.isEmpty()) return 0; return this.arr.pop() } top() { return this.arr[this.arr.length - 1]; } isEmpty原创 2021-03-26 09:21:34 · 230 阅读 · 0 评论 -
手动实现数组指定位反转
手动实现数组指定位反转 // 反转数组函数 var reverse = function (arr, k) { if (k < 1) { return; } let i = 0; j = k-1; while (i < j) { [arr[i], arr[j]] = [arr[j], arr[i]]; i++; j--; } } // 测试用例 reverse([1,2,3,4,5,6],3) ...原创 2021-03-20 17:34:18 · 257 阅读 · 0 评论 -
手动实现一个双向链表与双端队列
实现双向链表 // 自定义双向链表 class ListNode { constructor(data, next, pre) { this.data = data; this.next = next; this.pre = pre; } // 在当前节点前插入一个节点 insertPre(node) { node.pre = this.pre; node.next = this; if (this.pre) this.pre.next = n原创 2021-03-20 11:41:43 · 217 阅读 · 0 评论 -
LeetCode第622题:设计循环队列
// @lc code=start /** * @param {number} k */ var MyCircularQueue = function (k) { this.arr = Array(k); this.head = 0; this.tail = 0; this.cont = 0; }; /** * @param {number} value * @return {boolean} */ MyCircularQueue.prototype.enQueue = functio原创 2021-03-17 13:33:18 · 173 阅读 · 0 评论 -
LeetCode第86题:分隔链表
解法一 var partition = function (head, x) { if (!head) return head; // r1\r2分别为小于x和大于等于x的两条链表头结点 let r1 = new ListNode(0), r2 = new ListNode(0); // p1\p2分别为r1\r2的最后一个节点指针。链表为空初始化时就是头结点 let p1 = r1, p2 = r2; let p = head, q; while (p) { q = p原创 2021-03-16 08:52:35 · 174 阅读 · 0 评论 -
LeetCode第82题:删除排序链表中的重复元素 II
// 1.使用虚拟头节点 // 2.双层循环判断下一个节点是否是重复的val var deleteDuplicates = function (head) { if (!head) return head; let p = head; let ret = new ListNode(0, head); let q = ret; while (p && p.next != null) { if (p.val == p.next.val) { let tai原创 2021-03-15 13:33:05 · 130 阅读 · 0 评论 -
普通队列与循环队列的概念与实现
// 队列是一片连续的存储区 // 普通队列,队首出队尾入、fifo; // 循环队列,解决普通队列的假溢出现象; // 优先队列,允许插入数据; // 双向队列,队首与队尾都可以入队出队; // 左闭右开原则,通常队列尾指针指向了队列最后一个元素的下一个空元素 [1,2,3,4,5] 头指针指向1,尾指针指向6(5的下一位空指针) /* * * @author: 田源 * @date: 2021-03-12 19:26 * @description: 普通队列实现 * */ (() => { c原创 2021-03-15 13:27:23 · 394 阅读 · 0 评论 -
LeetCode第192题:反转链表解法
var reverseBetween = function (head, left, right) { if (!head) return null; let ret = new ListNode(-1, head); // 虚拟头节点 let pre = ret; let cnt = right - left + 1; while (--left) { pre = pre.next; } pre.next = reverse(pre.next, cnt) retur原创 2021-03-09 11:38:47 · 166 阅读 · 0 评论 -
LeetCode第141题:环形链表解法
整体解题思路为使用快慢指针 var hasCycle = function (head) { if (!head) return false; let p = head; // 慢指针,每次一步 let q = head; // 快指针,每次两步 while (q && q.next) { p = p.next; q = q.next.next; // p==q的情况下就是有环 if (p === q) { return true;原创 2021-03-06 09:47:10 · 149 阅读 · 0 评论 -
用两种不同方式手动实现链表
什么是链表 简单来说:一串包含指针域与数据域并且由指针域以此相关联的松散数据结构 (() => { // 链表形式一 class node { constructor(value) { this.data = value; // 定义链表的数据域为value this.next = null; // 定义链表的指针域为null }; } let head = new node(1); // 设置第一个节点head数据域为1 let h原创 2021-03-05 21:59:57 · 191 阅读 · 0 评论