随笔分类 -  数据结构与算法

摘要:题型概述和分析 滑动窗口问题通常会给出一长一短的两个字符串:s和t 核心目的是让你判断s中是否包含t 整体的思路如下: 初始化两个哈希表,need表示字符串t各个字符的个数,window表示当前窗口内各个所需字符的个数,用变量missingType表示当前窗口缺少的字符种类 用 left 和 rig 阅读全文
posted @ 2021-01-16 22:29 BAEBAE996 阅读(100) 评论(0) 推荐(0)
摘要:题目描述 解题思路 我们可以将问题改写成: 现在有2n个位置,每个位置可以放 ( 或者 ),组成的所有括号组合中,哪些是合法的? 解决这个问题只需要分2步: 暴力枚举所有可能的情况,共有2的2n次方 在做选择之前,进行“剪枝” 1、暴力枚举 只需要直接套用回溯算法的框架即可: 当path的长度为2n 阅读全文
posted @ 2021-01-10 14:14 BAEBAE996 阅读(139) 评论(0) 推荐(0)
摘要:题目描述 解题思路 在写代码之前,思考以下3个问题: 如何判断是否已经满足结束条件? 如何在选择列表中选择一个? 如何撤销选择? 对全排列这个问题进行具体分析,逐一击破: 1、如何判断是否已经满足结束条件? 显然,每一种全排列的长度 与 题目给定的数组长度一致 因此,只需要比较路径的长度 与 题目给 阅读全文
posted @ 2021-01-06 22:33 BAEBAE996 阅读(84) 评论(0) 推荐(0)
摘要:题目描述 实现思路 1、大致分析 依据题目,可以列举出几个显而易见的事实: 调用get方法, 返回该key对应的val 调用get或者put方法访问某个key,该key对应的freq加一 如果在容量满了以后进行插入,则需要将freq最小的key删除,如果最小的freq对应多个key,则删除其中最旧( 阅读全文
posted @ 2021-01-05 22:05 BAEBAE996 阅读(356) 评论(0) 推荐(0)
摘要:LRU:最近最少使用 题目描述 算法设计 cache这个数据结构需要具备以下条件: 元素必须有时序,当容量满了以后要删除最久未使用的元素 get方法要求在O(1)的时间复杂度内,快速找到cache中是否存在某个key 每次调用get方法,需要将被访问元素变为最近使用的,即cache要支持在O(1)的 阅读全文
posted @ 2020-12-22 15:00 BAEBAE996 阅读(165) 评论(0) 推荐(0)
摘要:入门版(2题) 题目描述 解题思路:迭代 + dummy node 在给定的链表中,数字所在的位数随着链表前进方向而变高 因此,在每一轮迭代中: 计算相同位置上的两数相加之和 res 根据res得出进位cin为0或1 res对10取余后,放进新节点中 令 上一个节点(prev)的next 指向当前的 阅读全文
posted @ 2020-11-29 16:40 BAEBAE996 阅读(81) 评论(0) 推荐(0)
摘要:入门版(206题) 题目描述 解题思路:迭代 使用cur和pre两个指针,一前一后(一左一右)地指向两个相邻节点 在每一轮迭代中: 用临时指针保存pre的next 让pre的next(掉头)指向cur cur和pre都沿着链表原来的方向,向前(右)走一步 当pre为空时,迭代结束 此时cur就是新链 阅读全文
posted @ 2020-11-29 11:30 BAEBAE996 阅读(95) 评论(0) 推荐(0)
摘要:入门版(83题) 题目描述 方案1、哈希表+快慢指针(空间复杂度较高) 解题思路 遍历链表,检查当前节点值是否存在于集合中 若存在,令慢指针的next指向快指针的next,快指针向前走,慢指针原地不动 若不存在,则将其加入集合中,快慢指针都向前走 代码实现(Javascript) var delet 阅读全文
posted @ 2020-11-28 11:13 BAEBAE996 阅读(138) 评论(0) 推荐(0)
摘要:题目描述 解题思路:递归 前序遍历:根节点->左子节点->右子节点 中序遍历:左子节点->根节点->右子节点 针对前序和中序遍历的特点,我们不难得出以下思路 在每一轮递归中: 1、用preorder的头部值 初始化当前的root节点 2、在传入的2个数组的基础上,划分出当前root的左子树的前序/中 阅读全文
posted @ 2020-11-18 09:56 BAEBAE996 阅读(87) 评论(0) 推荐(0)
摘要:常用符号 & 与:两个位都为1,结果才为1 | 或:两个位都为0,结果才为0 ^ 异或:两个位相同为0,不相同为1 ~ 取反 << 左移:左移若干位,高位丢弃,低位补0 右移:右移若干位,低位丢弃,高位补0或者符号位(取决于编译器) 常用的位运算操作 x&1 :判断奇偶,若结果为1,则为奇数,否则为 阅读全文
posted @ 2020-11-10 09:23 BAEBAE996 阅读(100) 评论(0) 推荐(0)
摘要:题目描述 解题思路 二叉搜索树的性质是:左子节点<根节点<右子节点 利用这个性质,我们可以通过中序遍历,将节点从小到大推入数组中 当数组长度大于k时,停止遍历,直接返回数组的尾部元素即可 代码实现(Javascript) /** * @param {TreeNode} root * @param { 阅读全文
posted @ 2020-11-08 11:37 BAEBAE996 阅读(103) 评论(0) 推荐(0)
摘要:题目描述 实现思路(二分查找) 利用二分查找的思想,用 left、right和mid三个变量去逼近最终的结果 在每一轮循环中,令 mid = (left + right) / 2 若mid的平方大于目标,则缩小右边界 (right=mid) 若mid的平方小于目标,则增大左边界(left=mid) 阅读全文
posted @ 2020-11-08 09:44 BAEBAE996 阅读(237) 评论(0) 推荐(0)
摘要:题目描述 对应LeetCode的第104题和第111题 BFS求最大深度 广度优先搜索是按照层级去遍历二叉树的 因此,我们可以在广度优先搜索的基础上 用一个变量depth去记录当前深度 每一轮外循环都对 depth+1 并嵌套内循环: -将处于当前层级的节点都出队 -并将这些节点的所有子节点都入队 阅读全文
posted @ 2020-11-05 11:20 BAEBAE996 阅读(390) 评论(0) 推荐(0)
摘要:题目描述 实现思路 二叉树的层次遍历,是与广度优先搜索的特点相对应的 原来的广度优先搜索代码如下: var bfs=function(root){ var visited=new Array() if(root!==null){ var queue=new Array queue.push(root 阅读全文
posted @ 2020-11-05 11:00 BAEBAE996 阅读(121) 评论(0) 推荐(0)
摘要:题目描述 实现思路 根据题目的描述,可以理解为: 在给定的数组中 找出 出现次数最多的一个元素(假定一定有一个这样的元素) 那么我们可以借助一个哈希表 来存储各个元素出现的次数 遍历完数组后,再找出哈希表中的value最大值 代码实现(Javascript) 首先遍历数组: 1、用map.get(k 阅读全文
posted @ 2020-11-02 14:14 BAEBAE996 阅读(83) 评论(0) 推荐(0)
摘要:3种常见的遍历方式如下: 中序遍历:左子节点->根节点->右子节点 先序遍历:根节点->左子节点->右子节点 后序遍历:左子节点->右子节点->根节点 为方便记忆,可以理解为根节点的相对位置 中序:根节点出现在左右子树中间 先序:根节点出现在子树之前 后序:根节点出现在子树之后 树节点的定义 /** 阅读全文
posted @ 2020-10-31 10:19 BAEBAE996 阅读(167) 评论(0) 推荐(0)
摘要:###题目描述 解题思路 这道题目的本质 可以理解为 判断2个字符串中 各字符出现的次数是否一致 方法一:数组 我们可以通过js提供的几个方法,将原字符串整理成 排好序的字符串 例如:"array"整理成"aarry" 在这种情况下,只需比较2个字符串是否完全相同即可 1、split方法 用于将字符 阅读全文
posted @ 2020-10-27 10:43 BAEBAE996 阅读(102) 评论(0) 推荐(0)
摘要:题目描述 解题思路 维护以下2个动态数组 1、双向队列temp 它用于保存原数组的下标,队首是当前窗口中的最大值 利用pop方法实现队尾出队,利用splice(0,1)实现队首出队 2、普通数组arr 在每一轮循环最后,将temp的队首推入arr 循环结束后,返回arr 其实我们可以弱化“窗口”这个 阅读全文
posted @ 2020-10-25 20:55 BAEBAE996 阅读(102) 评论(0) 推荐(0)
摘要:题目描述 实现思路一:堆 一种比较经典的做法是:维护一个只有K个元素的最小堆 这样,当前数据流中的第K大元素一定位于堆的顶部(数组头部) 当有新的数据进入时,将其与堆顶元素比较 若堆顶元素更大,则无视新的数据 若堆顶元素更小,则将其移出堆,并将新元素放入堆,再重新整理堆 在C++标准库中,堆可以使用 阅读全文
posted @ 2020-10-24 15:52 BAEBAE996 阅读(177) 评论(0) 推荐(0)
摘要:题目描述 实现思路 题目的实质 其实是检查给定的字符串中 是否含有指定顺序的 'a' 'b' 'c'序列 很容易想到用栈来实现 首先,检查给定字符串的长度,如果不是3的倍数,一定不是有效的 其次,遍历字符串 1、若当前栈长度大于等于3,则检查靠近栈顶的3个元素是否分别为 'c',' b', 'a' 阅读全文
posted @ 2020-10-24 11:12 BAEBAE996 阅读(99) 评论(0) 推荐(0)