数据结构
文章平均质量分 50
*^O^*—*^O^*
这个作者很懒,什么都没留下…
展开
-
leetcode 626前K个高频单词
问题描述给一非空的单词列表,返回前 k 个出现次数最多的单词。返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率,按字母顺序排序。https://leetcode-cn.com/problems/top-k-frequent-words/示例:输入: [“i”, “love”, “leetcode”, “i”, “love”, “coding”], k = 2输出: [“i”, “love”]解析: “i” 和 “love” 为出现次数最多的两个单词,均为2次。注意,按字原创 2021-04-01 16:50:07 · 245 阅读 · 2 评论 -
牛客 坏键盘打字(简解)
问题描述:旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及实际被输入的文字,请你列出肯定坏掉的那些键。https://www.nowcoder.com/questionTerminal/f88dafac00c8431fa363cd85a37c2d5e输入描述输入在2行中分别给出应该输入的文字、以及实际被输入的文字。每段文字是不超过80个字符的串,由字母A-Z(包括大、小写)、数字0-9、以及下划线“_”(代表空格)组成。题目保证2个字符串均非空。原创 2021-04-01 14:49:55 · 267 阅读 · 1 评论 -
哈希冲突 闭散列 开散列(哈希桶)
哈希表可以不经过任何比较,一次直接从表中得到要搜索的元素。如果构造一种存储结构,通过某种函数(hashFunc)使元素的存储位置与它的关键码之间能够建立一一映射的关系,那么在查找时通过该函数可以很快找到该元素。插入元素:根据待插入元素的关键码,以此函数计算出该元素的存储位置并按此位置进行存放。搜索元素:对元素的关键码进行同样的计算,把求得的函数值当做元素的存储位置,在结构中按此位置取元素比较,若关键码相等,则搜索成功。该方式即为哈希(散列)方法,哈希方法中使用的转换函数称为哈希(散列)函数,构原创 2021-03-30 15:06:06 · 326 阅读 · 0 评论 -
二叉搜索树的删除,添加,获取节点
什么是二叉搜索树二叉搜索树又称二叉排序树,它或者是一棵空树**,或者是具有以下性质的二叉树:若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子树也分别为二叉搜索树删除的八种范例这里删除需要分很多情况,这里我们把要删除的节点设为cur,它的父节点为parentcur.left == null 1. cur 是 root,则 root = cur.right 2. cur 不是 root,cur 是 parent.原创 2021-03-30 14:24:43 · 216 阅读 · 0 评论 -
常见的排序算法(3) 快速排序 归并排序 递归与非递归实现
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录快速排序原理代码优化方法归并排序原理代码优化方法快速排序不稳定原理从待排序区间选择一个数,作为基准值(pivot);Partition: 遍历整个待排序区间,将比基准值小的(可以包含相等的)放到基准值的左边,将比基准值大的(可以包含相等的)放到基准值的右边;采用分治思想,对左右两个小区间按照同样的方式处理,直到小区间的长度 =1,代表已经有序,或者小区间的长度 == 0,代表没有数据。时间复杂度最好O(n原创 2021-03-26 18:37:27 · 265 阅读 · 0 评论 -
堆的应用,TopK问题
问题描述简单来说就是在一堆数据里面找到前 K 大(当然也可以是前 K 小)的数。这个问题也是十分经典的算法问题,不论是面试中还是实际开发中,都非常典型。解题思路看到这里我们想的是,可以直接建立一个大的数据堆,取K次堆顶元素,这样虽然得到的K个数字是有序的,但是我们的空间复杂度就会很大。还有一种解题思路,我们只需要建立前K个数据的小堆,然后遍历后面的数据,如果比堆顶元素大,那就把堆顶元素删除,将它入堆,如果小,就跳过,当我们遍历结束的时候,我们得到的就是前K个大的数字了,这样效率更高。代码示例im原创 2021-03-26 09:59:16 · 186 阅读 · 0 评论 -
常见的排序算法(2) 选择排序 ,冒泡排序 两者的区别
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言选择排序原理代码冒泡排序原理代码前言选择排序原理代码冒泡排序原理代码原创 2021-03-25 18:00:33 · 539 阅读 · 1 评论 -
常见的排序算法(1) 插入排序,希尔排序,堆排序
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言前言提示:以下是本篇文章正文内容,下面案例可供参考原创 2021-03-25 12:14:36 · 225 阅读 · 0 评论 -
优先级队列(PriorityQueue),实现自己的优先级队列(堆的基本操作)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考一、pandas是什么?示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。二、使用步骤1.引入库代码原创 2021-03-24 16:53:44 · 332 阅读 · 0 评论 -
堆的概念 ,堆向下调整,向上调整
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言堆的定义堆的性质堆的存储方式向下调整(小堆为例)思路代码向上调整调整思路代码前言优先级队列:提供两个最基本的操作,一个是返回最高优先级对象,一个是添加新的对象。(优先级队列)PriorityQueue底层使用了堆的数据结构,而堆实际就是在完全二叉树的基础之上进行了一些元素的调整。堆的定义如果有一个关键码的集合K = {k0,k1, k2,…,kn-1},把它的所有元素按完全二叉树的顺序存储方式存储。在一个一原创 2021-03-23 14:35:45 · 455 阅读 · 0 评论 -
非递归遍历二叉树
先序遍历方法这里我们使用栈来进行遍历,首先将根节点压栈将栈顶元素出栈判断出栈的节点左右孩子节点是否为空,不为空,先压右节点,再压左节点回到第一步当栈为空时,就跳出循环;代码 public List<Integer> preorderTraversal(TreeNode root) { List<Integer> list = new ArrayList<>(); if(root == null){原创 2021-03-22 12:02:07 · 172 阅读 · 0 评论 -
leetcode 根据二叉树创建字符串
题目描述你需要采用前序遍历的方式,将一个二叉树转换成一个由括号和整数组成的字符串。空节点则用一对空括号 “()” 表示。而且你需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。输入: 二叉树: [1,2,3,4]输出: “1(2(4))(3)”解释: 原本将是“1(2(4)())(3())”,在你省略所有不必要的空括号对之后,它将是“1(2(4))(3)”。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/constr原创 2021-03-21 20:32:43 · 200 阅读 · 0 评论 -
leetcode 从前序与中序遍历序列构造二叉树,从后序与中序遍历序列构造二叉树
1 从前序与中序遍历序列构造二叉树题目描述解题思路代码2 从后序与中序遍历序列构造二叉树题目描述解题思路代码原创 2021-03-21 19:30:42 · 239 阅读 · 0 评论 -
牛客 二叉搜索树与双向链表
题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。https://www.nowcoder.com/practice/947f6eb80d944a84850b0538bf0ec3a5?tpId=13&tqId=11179&rp=1&ru=%2Factivity%2Foj&qru=%2Fta%2Fcoding-interviews%2Fquestion-ranking&tab=answerKey原创 2021-03-19 15:52:45 · 206 阅读 · 0 评论 -
leetcode 求二叉树的最近公共祖先(带图解)
题目描述给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree解题思路这里我们使用上述的树,假设我们输入的节点为 7,4:原创 2021-03-19 10:24:57 · 1848 阅读 · 0 评论 -
leetcode 102 二叉树的层序遍历(详解)
题目描述给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。102.二叉树的层序遍历解题思路首先我们需要使用一个成员变量来记录最终结果,即时代码递归的很深,也能随时操作这个成员变量的,如下代码中的result ;接着我们需要按照每一层进行遍历的方式进行插入,这里使用了一个helper方法,里面有两个参数,一个是我们要插入的节点,另一个就是要插入的层数,这里是从第零层开始往下走的;每次插入的时候我们需要先保证我们的result中是有我们所需要的哪一个下标的原创 2021-03-18 18:01:59 · 225 阅读 · 0 评论 -
牛客网 二叉树遍历 KY11
题目描述编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。 例如如下的先序遍历字符串: ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。二叉树遍历输出描述可能有多组测试数据,对于每组数据,输出将输入字符串建立二叉树后中序遍历的序列,每个字符后面都有一个空格。每个输出结果占一行。解题思路首先我们可以先创建一个节点的信息,接着写出程序的主框架,这里有一个多组输入的问题,这原创 2021-03-18 17:13:10 · 290 阅读 · 0 评论 -
二叉树的层序遍历,判断一个树是否为完全二叉树(思路解析)
1什么是层序遍历层序遍历就是从所在二叉树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第2层上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问树的结点的过程就是层序遍历。怎样实现层序遍历这里我们需要采用一个工具——队列,解题思路是这样的,首先将根节点入队列,然后进入一个循环,(1)队首元素出队列,(这时队列里面只有一个根节点),(2)出队列之后,将该节点的左孩子和右孩子入队列,然后返回第一步;这里要注意入队列之前还是要检查不为空的情况。代码 private st原创 2021-03-18 15:19:40 · 1283 阅读 · 0 评论 -
LeetCode判断一个树为平衡二叉树 ,判断一个树为对称二叉树(详解)
题目描述给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。平衡二叉树解题思路首先我们从根节点出发,要是它的左子树的高度和右子树的高度差距大于1,那么就返回false,不是的话就依次往下遍历,比如,遍历树的左子树,递归的方式,将整个树遍历完成。这里还需要写一个求树高度的方法,方便调用。代码展示class Solution { public boolean isBalanced(TreeNode原创 2021-03-18 12:25:40 · 274 阅读 · 0 评论 -
leetcode 判断相同的树,判断一个树是否是另一个树的子树(详解)
题目描述给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。相同的树解题思路首先如果两个树都是空的话,那么这两个树,肯定就是相等的,如果只有一个是空,那么这两个树肯定就是不相等的,如果两个树的根节点的值不相等话,那么肯定也就不相等,最后再依次判定这两个树的左子树和右子树。代码展示class Solution { public boolean isSameTree(TreeNode p, TreeNo原创 2021-03-17 22:50:53 · 378 阅读 · 0 评论 -
leetcode中二叉树的前序遍历
题目详情题解首先我们看到原始代码的返回值是 List 所以说我们需要来一个顺序表来吧这些值按照前序遍历的方法依次加入;代码展示class Solution { public List<Integer> preorderTraversal(TreeNode root) { List<Integer> list = new ArrayList<>(); if(root == null){ return l原创 2021-03-13 22:01:37 · 208 阅读 · 0 评论 -
二叉树求叶子节点的个数,求K层节点的个数,获取二叉树的高度
求节点的个数我们就采用先序遍历的方法,只要不为空的节点都+1,采用递归的方法进行遍历, public static int getSize(TreeNode root){ if(root == null){ return 0; } return 1+getSize(root.left)+getSize(root.right); }求叶子节点的个数和上述方法几乎差不多,这里只要加的是左孩子和右孩子都是空的节点就.原创 2021-03-13 20:45:58 · 295 阅读 · 0 评论 -
二叉树的简解(计算各层节点个数的公式总结),前序,中序,后序遍历
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言1.树的一些定义2.二叉树的一些性质二叉树的特点两种特殊的二叉树二叉树的性质3.前序,中序,后序遍历前言1.树的一些定义节点的度:一个节点含有的子树的个数称为该节点的度;树的度:一棵树中,最大的节点的度称为树的度;叶子节点或终端节点:度为0的节点称为叶节点;双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点;孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点;根结点:一棵树中,没原创 2021-03-13 20:17:35 · 4541 阅读 · 0 评论 -
leetcode求最近请求次数
题目写一个 RecentCounter 类来计算特定时间范围内最近的请求。请你实现 RecentCounter 类:RecentCounter() 初始化计数器,请求数为 0 。int ping(int t) 在时间 t 添加一个新请求,其中 t 表示以毫秒为单位的某个时间,并返回过去 3000 毫秒内发生的所有请求数(包括新请求)。确切地说,返回在 [t-3000, t] 内发生的请求数。保证 每次对 ping 的调用都使用比之前更大的 t 值。(https://leetcode-cn.com原创 2021-03-11 17:06:28 · 251 阅读 · 0 评论 -
leetcode设计循环双端队列
这个题我也不太会,写在这里也是方便复习,若有大佬有好的理解方法,还请不吝赐教首先,只要是循环队列,就需要设置两个指针分别指向队列的头和尾,但是由于是循环队列,本来我们单向队列判定队列为满的方法就无法使用了,头指针和尾指针同时指向同一个节点,无法判断是空还是满,这里我们有两种方法,一种是再引入一个变量来记录,队列中的数是否满,第二种就是将一个节点置为空,专门用来判断;这里我就使用的是第二种方法;public class MyCircularDeque { private int capacit原创 2021-03-11 16:31:10 · 251 阅读 · 0 评论 -
Vector和 ArrayList 的区别简答
Vector是历史遗留的内容,现在已经几乎不使用;Vector也是顺序表,和ArrayList基本差不多,细节上有差异;Vector 是线程是部门内部那么别内部那么hnjkbl/kniklnuio’他有发v给gbhjjmk.bm,l:qweqweasdasdasdAs? ...原创 2021-03-09 21:23:14 · 179 阅读 · 0 评论 -
Java 数据结构中常见类的继承关系图
原创 2021-03-09 21:02:38 · 1083 阅读 · 0 评论 -
Java栈和队列 实现自己的栈和队列
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录什么是队列简单实现队列什么是栈简单的实现一个栈在标准库中栈和队列的区别什么是队列队列我的理解就是排队,先到先出,只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表入队列:进行插入操作的一端称为队尾出队列:进行删除操作的一端称为队头简单实现队列package Queue;class Node{ int val; Node next=null; public Node(int原创 2021-03-09 18:56:09 · 205 阅读 · 0 评论 -
实现一个自己的链表实现增删改查
先创建一个节点package LinkedList;public class Node { int val; Node next; Node prev; public Node(int val) { this.val = val; } @Override public String toString() { return " "+val; }}创建一条链表package LinkedList原创 2021-03-06 18:20:00 · 1257 阅读 · 0 评论 -
判断回文链表
题目对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。测试样例题目分析回文就是前后读起来都一样,假如一个链表是回文链表,那么该链表的前半段和后半段的逆链表不就是一样了吗,这里还是用到了链表的反转,将链表一分为二,后半段进行反转,反转方法还是原来的掰道岔的方法。那假如是奇数个 1->2->3->2->1,结果就是1->2,原创 2021-03-05 10:42:44 · 208 阅读 · 1 评论 -
数据结构 将两个有序的链表合并为一个新链表
问题描述将两个有序的链表合并为一个新链表,要求新的链表是通过拼接两个链表的节点来生成的,且合并后新链表依然有序。比如{1,4} {3,5},合并就是{1,3,4,5};解题思路首先我们要判定是否有一个链表为空,都为空,返回空,一个为空,则返回不为空的那个;其次找到,两个链表的第一个节点,比较小的那个,作为主链(head),将另一个的节点元素,依次比较,并入其中,最后肯定有一个链表先走完,那么只需要把未走完后续链表并入就好了。代码展示 public ListNode mergeTwoLists原创 2021-02-22 12:55:01 · 4385 阅读 · 0 评论 -
数据结构 判断给定的链表中是否有环
问题描述判断给定的链表中是否有环。如果有环则返回true,否则返回false。你能给出空间复杂度O(1)的解法么?解题思路由于这里的链表会存在环,所以单纯的判定尾节点的next是否为null,是不行的,会进入死循环,这时我们可以用一个快慢指针来解决问题,快的指针每次走两步,慢的指针每次走一步,为了更好的判定循环,因为快的走在前,所以用它判断是否继续循环;若是存在环,那么总有那么一次是两个指针指向同一个节点,这时我么返回真就好了。代码展示/** * Definition for singly-l原创 2021-02-21 09:44:16 · 222 阅读 · 0 评论 -
数据结构 反转一个单链表
这里没有使用开辟临时空间的方法,用了一种更高效的方法,将三个引用分别指向三个结点,依次更改结点的指向,最终做到反转链表。到最后一个结点,退出,这时在循环外更改返回。/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val;.原创 2021-02-07 12:43:44 · 189 阅读 · 0 评论 -
数据结构 链表的各种删除 (删除链表中等于给定值 val 的所有节点)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录1.按照节点的值中间删除2.按照结点中间删除3.按照下标进行删除4.头部删除5.尾部删除1.按照节点的值中间删除2.按照结点中间删除3.按照下标进行删除4.头部删除5.尾部删除...原创 2021-02-06 18:44:51 · 400 阅读 · 0 评论 -
数据结构 链表的各种插入
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言1.中间位置插入2.头部插入3.尾部插入验证前言链表的任意的位置插入时间复杂度都是O(1),没有增容问题,插入一个就开辟一个空间,这是链表相对于顺序表的优点,那么我们就来看看这个各种插入是怎样插入的。1.中间位置插入 public static Node MidInsertion(Node head,Node Insert,int index){ Node cur = head;原创 2021-02-06 17:50:38 · 878 阅读 · 2 评论 -
数据结构 顺序表实现一副扑克牌的洗牌+发牌功能
先写一个扑克牌的类public class Card { public String color;//颜色 public String Csize;//牌的大小 public Card(String color, String csize) { this.color = color; Csize = csize; } @Override public String toString() { return原创 2021-02-06 13:25:49 · 564 阅读 · 0 评论 -
数据结构 链表的各种遍历
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言1.打印链表的每个元素前言元素(element): 真实存于线性表中的内容,是我们关心的核心内容。结点(node): 为了组织链表而引入的一个结构,除了保存我们的元素之外,还会保存指向下一个结点的引用1.打印链表的每个元素...原创 2021-02-06 12:14:18 · 1699 阅读 · 0 评论 -
数据结构 实现一个简单的顺序表
顺序表线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串…线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。注意: 顺序表中一定要区分两个概念 容量(capacity) vs 元素个数(size);线性表的所有下标只和元素个数相关,和容量无关。代码package ArrayList;public原创 2021-02-03 19:33:50 · 621 阅读 · 0 评论 -
数据结构 时间复杂度 空间复杂度
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录1.什么是数据结构数据结构原理大O渐进表示法2.时间复杂度算法效率时间复杂度原理简单示例3.空间复杂度原理简单示例1.什么是数据结构数据结构(Data Structure)是一门研究数据的组织和管理的学科。往往从外在表现为一组数据的集合或者容器。概念解释:元素(Element):被管理的原子数据,元素类型不限。集合(Collection):存放元素的容器,需要利用一定的数据结构知识对元素进行组织。遍历(Traversa原创 2021-01-30 20:52:03 · 317 阅读 · 0 评论