
数据结构
我是菜狗救救我
这个作者很懒,什么都没留下…
展开
-
剑指offer:最小的k个数的两种Java解决(冒泡排序与大根堆)
题目输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。方法1,改进后的冒泡排序(时间复杂度为O(n*k))问题分析普通的冒泡排序使用了两层循环,第一层循环遍历了数组中所有的元素,第二层循环比较相邻的元素。如果第一个比第二个大,就交换他们两个。因此,我们并不需要得到所有数组元素的大小排序结果,我们只需要将外循环执行k次即可。注意!!!冒泡排序每一次冒泡最大值(或最小值)都在数组最末端,每一次添加元素时,需要从数组末尾抽取,这时的元原创 2020-09-10 16:19:40 · 276 阅读 · 0 评论 -
剑指offer34:二叉树中和为某一值的路径(最全解题方法总结和遇到的坑及反思)
题目输入一颗二叉树的根节点和一个整数,按字典序打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。如图所示:思路我的思路是递归:递归方法是返回当前路径下匹配目标值的路径。共有几种情况:当节点为空,return当和大于目标值,return当和等于目标值 并且 节点下无其他节点节点下无其他节点说明是叶子节点,并且路径值的和满足了目标值,添加到结果中 并且return当和小于目标值,继续递归遇到的坑第一眼看到这道题的时候原创 2020-08-13 10:50:12 · 149 阅读 · 0 评论 -
树的广度优先遍历和深度优先遍历并用Java实现
现在假设有一颗这样树,(是不是二叉树都没关系,原理都是一样的)1.广度优先遍历英文缩写为BFS即Breadth FirstSearch。其过程检验来说是对每一层节点依次访问,访问完一层进入下一层,而且每个节点只能访问一次。对于上面的例子来说,广度优先遍历的 结果是:A,B,C,D,E,F,G,H,I(假设每层节点从左到右访问)。先往队列中插入左节点,再插右节点,这样出队就是先左节点后右节点了。广度优先遍历树,需要用到队列(Queue)来存储节点对象,队列的特点就是先进先出。例如,上面这颗树的访问如原创 2020-08-11 10:44:03 · 580 阅读 · 0 评论 -
Java实现剑指Offer27: 树的子结构以及遇到的坑
题目输入两颗二叉树A和B,判断B是不是A的子结构。例如,右边的树是左边的树的子结构。分析1.在大树中找到和小树根节点相同的节点。2.然后以此节点为根节点,在大树上往下搜索对比小书左右节点是否相同,不同则返回false3.如果2步中最后返回false 回到第一步,从大树的左子树找和小树根节点相同的节点。4.如果3步中最后返回false 回到第一步,从大树的右子树找和小树根节点相同的节点。代码思路两个递归解决该问题。首先创建一个名为HasSubtree的方法来判断大树中有没有和小树根节点相同的原创 2020-08-10 14:55:32 · 125 阅读 · 0 评论 -
剑指offer25:合并两个排序链表的两种解法(递归与非递归)Java
题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。非递归遍历两个链表,按大小顺序拼接public ListNode Merge(ListNode list1, ListNode list2) { ListNode head = new ListNode(0); ListNode movnode = head; while (list1 != null && list2 != null) { i原创 2020-08-10 10:23:04 · 162 阅读 · 0 评论 -
剑指offer:正则表达式匹配Java实现以及错误反思
题目描述请实现一个函数用来匹配包括’.‘和星号的正则表达式。模式中的字符’.'表示任意一个字符,而星号表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"ab*a"均不匹配。代码思路当模式中的第二个字符是星号时:如果字符串第一个字符跟模式第一个字符不匹配,则模式后移2个字符,继续匹配(相当于星号前面的)。如果字符串第一个星号字符跟模式第一个字符匹配,可以有3种匹配方式:1.模原创 2020-08-08 15:04:52 · 165 阅读 · 0 评论 -
剑指offer面试题8:二叉树的下一个节点(两种递归解法)
题目描述给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。由于作者的递归思想掌握的不好,故本题尝试用递归方法求解。第一种递归方法画一个二叉树,然后模拟一下,可知用递归来实现是比较方便的。并且还有两个特点:① 当前节点单独考虑,因为找的下一个节点必然是右子树的最左节点(右子树存在的条件下);② 右子树为空需要单独考虑,因为右子树可能是整棵树的最右节点,故而没有下一个节点,也有可能是较好条件下的节点,找到出现左路径原创 2020-08-04 14:48:49 · 175 阅读 · 0 评论 -
Java初学者对快速排序的总结以及错误反思
快排的基本思想1). 先从数列中取出一个数作为基准数。2). 分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。3). 再对左右区间重复第二步,直到各区间只有一个数。两种快排类型:左右填坑法与前后交换法第一种,挖坑填数:这种方法很经典,首先抽取枢纽元素,然后设置两个指针分别从左右两端开始,将小于枢纽元素的填补到数组左端空缺位置,大于枢纽元素的填补到数组右端空缺位置,每次填补之后换成另一端开始遍历。第二种,前后交换法:一种比较巧妙的实现方法,首先将枢纽元素放在最右原创 2020-08-04 20:06:41 · 458 阅读 · 0 评论