数据结构
文章平均质量分 84
码农随笔
这个作者很懒,什么都没留下…
展开
-
数据流中的第 K 大元素
设计一个找到数据流中第 k 大元素的类(class)。注意是排序后的第 k 大元素,不是第 k 个不同的元素。请实现 KthLargest类:KthLargest(int k, int[] nums) 使用整数 k 和整数流 nums 初始化对象。int add(int val) 将 val 插入数据流 nums 后,返回当前数据流中第 k 大的元素。如下:输入:["KthLargest", "add", "add", "add", "add", "add"][[3, [4, 5, 8.原创 2022-01-03 21:48:57 · 692 阅读 · 0 评论 -
堆排序详解
上一篇博文大概讲述了优先级队列的实现,这一篇来谈一下堆和堆排序,优先级队列参考如下博文。详解二叉堆,及优先级队列实现上述博文中介绍了完全二叉树,满二叉树,堆及堆的存储,以及介绍了优先级队列的一些实现,这一篇博文来介绍下堆排序相关的内容。 上文中提供了一些常用的方法,如插入一个元素时,为了维持堆的特性需要执行上浮(swim)方法,以及删除一个元素时为了维持堆的性质而执行的下沉(sink)方法。以及一些如求左孩子left方法,和求右孩子right......原创 2021-10-29 13:38:05 · 195 阅读 · 0 评论 -
二叉查找树
二叉查找树是二叉树中最常用的一种类型,也叫二叉搜索树。顾名思义,二叉查找树是为了实现快速查找而生的。不过,它不仅仅支持快速查找一个数据,还支持快速插入、删除一个数据。它是怎么做到这些的呢?这些都依赖于二叉查找树的特殊结构。二叉查找树要求,在树中的任意一个节点,其左子树中的每个节点的值,都要小于这个节点的值,而右子树节点的值都大于这个节点的值。...原创 2021-10-25 18:01:53 · 7389 阅读 · 0 评论 -
跳表(skip list)
前面博文(链表相关的)有提过,链表查询一个元素的时间复杂度是O(n)。数组根据下标查找的时间复杂度是O(1),前面的文章也提到过二分查找算法对于元素查找的改变,但是二分查找算法的底层其实是依赖于数组的随机访问特性,分配内存时,对于数组,是需要连续的空间,有时候给数组分配内存时可能会引发频繁的GC。那既然二分查找算法查找性能那么高,但是底层使用数组对内存的要求很高,那可否使用链表来代替元素的存储,即如果元素底层是基于链表存储时能不能有相应效率的“二分查找算法”?其实我们可以稍微对链表进行改造,就可以支持类原创 2021-10-22 14:51:22 · 234 阅读 · 0 评论 -
详解二叉堆,及优先级队列实现
首先介绍下满二叉树和完全二叉树一、满二叉树,非叶子节点的度为2(有两个子节点),叶子节点全部处于同一层上满二叉树满二叉树除了满足普通二叉树的性质,还具有以下性质:1、满二叉树中第 i 层的节点数为 个。2、深度为 k 的满二叉树必有 个节点 ,叶子数为 。3、满二叉树中不存在度为 1 的节点,每一个分支点中都两棵深度相同的子树,且叶...原创 2021-10-09 18:07:32 · 348 阅读 · 0 评论 -
Leetcode打家劫舍系列问题
Leetcode198你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。输入:[2,7,9,3,1]输出:12解释:偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1...原创 2021-09-28 20:01:24 · 355 阅读 · 0 评论 -
单调栈的简单应用
栈是一种先进后出的数据结构,只能在栈顶进行元素的入栈和出栈,原创 2021-09-23 23:11:45 · 384 阅读 · 0 评论 -
8皇后问题
8皇后问题的描述见百度百科,这里大概描述下,在如下这种 8 *8的网格里面放入8个皇后,使得放入的这些皇后之间不能相互攻击,即任意两个皇后之间不能处于同一行,不能处于同一列,不能处于同一对角上如上图所示,在图中的位置放置一个皇后之后,阴影部分都不能再放置皇后了,非阴影位置可以继续放置皇后。题目就大概是这个意思。下面采用两种方法来进行解释【方法一】利用位运算的特性来进行说明,位运算可以参考博文初识位运算从题目中我们知道,任意两个皇后之间是不能处于同一行和同一列的,那 8 *...原创 2021-09-17 20:03:57 · 176 阅读 · 0 评论 -
初识位运算
初识计算机时就听说过一句话,计算机只认识0和,在现代计算机中所有的数据在内存中都是以二进制存在的。位运算直接对位进行操作,如果使用得好,很多时候能够取得很好的效果,下面简要的计算几种常见的位运算及其位运算相关的题。1、与(&)运算符只有当两位都是 1 时结果才是 1,否则为 02、或(|)运算符只有当两位都是 0时结果才为 0,否则为 13、异或(^)运算符当两位相同时,则结果为 0,两位不同时结果为 14、取反(~)运算符位的值为 0则变为 1 ,...原创 2021-09-08 20:24:22 · 1986 阅读 · 0 评论 -
Leetcode相同的树
给两棵二叉树的根节点p和q,编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。如下面的两颗二叉树:结构相同,而且对应节点的值是相同的如下面的二叉树,结构不同,所以不能算为是相同的二叉树再比如下面的二叉树,虽然结构相等,但是值不相等,也不能算为相同的二叉树详细题解一、基于递归的解决方法递归函数public boolean isSameTree(TreeNode p, TreeNode q) {}终...原创 2021-09-02 10:57:02 · 174 阅读 · 0 评论 -
如何找到字符串中的最长回文子串?
什么是回文串?回文串其实就是正读和反读一样的字符串,那我们如何判断一个字符串是回文串?其实实现逻辑也比较简单,我们只需要使用双指针,一个从前往后遍历,一个从后往前遍历,关注遇到的字符是否相等即可。代码如下:private static boolean isPalindromeString(String s) { if (s == null || s.length() == 0) { return true; } in.原创 2021-08-10 19:18:02 · 3721 阅读 · 0 评论 -
接雨水问题
给定n个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]输出:6解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。注:题目描述来源于leetcode题目解析:一个桶能装多少水是由最短的那块板决定的。如下所示那对于上面由n个柱子组成的序列,能装多少水也是同样的道理,找出每...原创 2021-08-03 16:44:58 · 226 阅读 · 0 评论 -
浅析哈夫曼树和哈夫曼编码
在浅析哈夫曼树之前,先来了解几个关于树的概念1、什么是路劲在树或者图中,从一个点到另一个点所经过的点被称为这两个点之间的路劲。上图中,从跟节点到叶子节点C的路劲就是A B C。2、什么是路劲的长度表示的树或者是图中从一个点到另一个点所经过的边的数量。如下图,从A - > C的路劲就是23、什么是 结点的带权路径长度?将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权。结点的带权路径长度为:从根结点到该结点之间的路径长度与该结点的权的乘积。如下图。..原创 2021-07-16 20:27:11 · 1541 阅读 · 1 评论 -
归并排序
上一篇博文我初步讲解了插入排序,冒泡排序和选择排序。这几种排序算法的时间复杂度都是O()。时间复杂度比较高,比较适合小规模的数据排序。介绍一种时间复杂度是O(nlogn)的算法。归并排序。其实归并排序采用的是分治思想,对于数据量比较大时,可以先把问题分为小问题,最终再把小问题的解合并为大问题的解。而且归并排序在解决大数据量时比较使用,读者可参考博文大数据中的归并排序。...原创 2021-03-10 23:22:43 · 187 阅读 · 0 评论 -
两个链表的第一个公共节点Java
输入两个链表,找出它们的第一个公共节点。链表的定义,哨兵节点等的处理见博文注意:如果两个链表没有交点,返回 null.在返回结果后,两个链表仍须保持原有的结构。可假定整个链表结构中没有循环。程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存。如下面的两个链表:我们知道链表是通过next引用串联起来的,两个链表第一个公共节点后面的节点都是相同的,所以差异就是第一个相同节点的前面节点。我们接下来看看如何解决这个问题。思路一:可以想象成两个人走路,如下图所示,如果两个人走路.原创 2021-03-01 19:30:23 · 293 阅读 · 0 评论 -
链表浅析及常用题目详解(链表反转,删除和环形链表等)
链表是物理存储单元上非连续的、非顺序的存储结构,它是由一个个结点,通过指针来联系起来的,其中每个结点包括数据和指针,如下图中单链表的表示。文中统一使用以下单链表的定义:public class Node { //节点next引用 public Node next; //节点的数值域 public int val; public Node() { } public Node(int val) { this.val .原创 2021-02-28 23:11:42 · 206 阅读 · 0 评论 -
LeetCode合并二叉树
给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为NULL 的节点将直接作为新二叉树的节点。示例1:输入:原始二叉树如下图 输出:合并后的二叉树如下图 解题思路:基于递归的解决思路...原创 2021-02-10 10:31:14 · 221 阅读 · 0 评论 -
Leetcode从根到叶的二进制数之和
题目描述给出一棵二叉树,其上每个结点的值都是0或1。每一条从根到叶的路径都代表一个从最高有效位开始的二进制数。例如,如果路径为0 -> 1 -> 1 -> 0 -> 1,那么它表示二进制数01101,也就是13。对树上的每一片叶子,我们都要找出从根到该叶子的路径所表示的数字。返回这些数字之和。题目数据保证答案是一个 32 位 整数。示例 1:输入:root = [1,0,1,0,1,0,1]输出:22解释:(100) + (101) + (110)...原创 2021-02-07 20:02:31 · 133 阅读 · 0 评论 -
填充每个节点的下一个右侧节点指针
给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:public class Node { public int val; public Node left; public Node right; public Node next;}填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。初始状态下,所有next 指针都被设置为 NULL。进阶:...原创 2021-01-25 20:25:49 · 130 阅读 · 0 评论 -
Leetcode对称二叉树
题目描述给定一个二叉树,检查它是否是镜像对称的。例如,二叉树[1,2,2,3,4,4,3]是对称的。但是下面这个[1,2,2,null,3,null,3]则不是镜像对称的:假设二叉树的节点定义如下所示:public class TreeNode { public int val; public TreeNode left; public TreeNode right; public TreeNode() { } pub...原创 2021-01-19 21:08:36 · 342 阅读 · 0 评论 -
二叉树遍历详解
二叉树的遍历方式是最基本,也是最重要的一类题目,我们将从「前序」、「中序」、「后序」、「层序」四种遍历方式出发,总结他们的递归和迭代解法。一、二叉树定义 二叉树(Binary tree)是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。二叉树特点是每个结点最多只能有两棵子树,且有左右之分。简单来说,就是一个包含节点,以及它的左右孩子的一种数据结构假设二叉树的节...原创 2021-01-16 13:29:51 · 5165 阅读 · 0 评论 -
Leetcode-每日温度Java
请根据每日 气温 列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用0 来代替。例如,给定一个列表temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是[1, 1, 4, 2, 1, 1, 0, 0]。提示:气温 列表长度的范围是[1, 30000]。每个气温的值的均为华氏度,都是在[30, 100]范围内的整数。解法一、暴力破解对于每一个温度,向后进...原创 2021-01-07 20:21:55 · 341 阅读 · 0 评论 -
Trie树(前缀树)的实现和应用
有500万单词,有如下需求1、如何快速判断某个单词是否在给定的单词中2、如何快速的判断给定前缀有多少个单词package com.Ycb.tree;import java.util.HashMap;/** * 字典树 */public class DictionaryTree { /** * 字典树节点 */ private class Node { /** * 节点所代表的字符 */原创 2020-08-25 18:46:42 · 119 阅读 · 0 评论 -
LRU缓存算法简单设计
采用双链表+HashMap的形式实现LRU缓存算法,节点代码结构如下:package com.Ycb.lru;public class LRUNode { String key; Object value; LRUNode next; LRUNode pre; public LRUNode() { } public LRUNode(String key, Object...原创 2020-04-27 20:45:22 · 235 阅读 · 0 评论 -
二分查找算法总结
一、简单的二分查找算法,代码如下对参数的合法性进行检查,参数不合法时直接抛出异常。 使用-1代表数组中不存在该元素 计算中间元素时,使用mid = left + ((right - left) >> 2) 代替(left + right)/2。因为left + right有可能会超出范围,使用位运算符性能相对会比除法运算符性能好。// 最简单的二分查找,不包含重复元素 ...原创 2020-03-06 00:03:12 · 964 阅读 · 0 评论 -
【LeetCode】- Java - 环形链表
给定一个链表,判断链表中是否有环。为了表示给定链表中的环,我们使用整数pos来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果pos是-1,则在该链表中没有环。示例 1:输入:head = [3,2,0,-4], pos = 1输出:true解释:链表中有一个环,其尾部连接到第二个节点。示例2:输入:head = [1,2], pos = 0...原创 2019-05-28 19:59:43 · 147 阅读 · 0 评论 -
【LeetCode】- Java - 滑动窗口最大值
给定一个数组nums,有一个大小为k的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口k内的数字。滑动窗口每次只向右移动一位。返回滑动窗口最大值。示例:输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3输出: [3,3,5,5,6,7] 解释: 滑动窗口的位置 最大值----------...转载 2019-05-18 16:58:34 · 610 阅读 · 0 评论 -
【LeetCode】- Java - 前K个高频元素
题目描述:给定一个非空的整数数组,返回其中出现频率前k高的元素。示例 1:输入: nums = [1,1,1,2,2,3], k = 2输出: [1,2]示例 2:输入: nums = [1], k = 1输出: [1]说明:你可以假设给定的k总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。 你的算法的时间复杂度必须优于 O(nlogn) ...原创 2019-05-16 20:43:51 · 410 阅读 · 0 评论 -
最小栈实现及优化
设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。push(x)-- 将元素 x 推入栈中。 pop()-- 删除栈顶的元素。 top()-- 获取栈顶元素。 getMin() -- 检索栈中的最小元素。示例:MinStack minStack = new MinStack();minStack.push(-2);minStack.pu...原创 2019-05-07 20:23:09 · 299 阅读 · 0 评论