数据结构与算法
本专栏是本人写的第一个专栏,因为是第一次学,也是想做为记笔记的方式来完成这个专栏的,如有不足,希望谅解,我是根据韩顺平老师的数据结构与算法的视频来学习的
weixin_46314604
这个作者很懒,什么都没留下…
展开
-
力扣之数组——
这道题的思路容易被题目的意思打乱,两个数比较较小的数移到数组的末尾,我们就会想如何去移动数组元素,因为数组一个元素的下标变了,会波及其他元素,从而给我们的题解带来很大的麻烦,然而,我们需要知道我们实现的功能是返回满足游戏规则的那个赢家,而不是去跟随题目的意思去编写代码,所以我们需要去玩几把游戏,就像题目中给出的示例一样,几乎已经覆盖了所有情况,下面我们来进行列举:首先,无论k值多大,赢家都应该在这个数组中,这是毋庸置疑的遇到数组中的最大值之前都没有出现满足条件的赢家,那么赢家肯定是这个数组的最大值..原创 2020-10-17 21:20:02 · 241 阅读 · 0 评论 -
力扣之数组——买卖股票的最佳时机
这道题的转换为数学问题就是数组的一前一后如何选出差值最大的值,注意是数组角标大的元素减去小的元素得到的差值。我的思想是:在遍历的过程中,动态的改变数组中最小的值,当然在遍历的时候,最大差值也在不断的更新。class Solution { public int maxProfit(int[] prices) { if(prices.length==0){ return 0; } int max=0; int.原创 2020-10-16 21:28:53 · 233 阅读 · 0 评论 -
力扣之数组——重复至少K次且长度为M的模式
这道题的题意就是在一个给定的数组中找到原创 2020-09-17 21:09:57 · 125 阅读 · 0 评论 -
力扣之字符串——一周中的第几天
一周中的第几天这道题的实现过程不难,代码相对来说比较基础,基本思路如下。思路我们必须知道这道题有个给定日期的区间,这个区间的最早时间应该就是1971-1-1,我们必须知道这天是星期几,然后根据这天往后推算,这是前提,经查阅这天是星期五。接下来,根据闰年,平年,一个月30天还是31天,或者又是28或者29天这些情况来进行分别讨论。下面先上代码:class Solution { public String dayOfTheWeek(int day, int month, int year)原创 2020-09-16 14:01:49 · 144 阅读 · 0 评论 -
力扣之递归——划分为K个相等的子集
划分为K个相等的子集这道题的意思是将数组中的元素分为K个子集,每个子集的和都相等,显然,数组中的元素不能重复使用,而且每个元素都要用到。首先我们来分析一下这道题的解题思路。思路首先每个子集的总和的值为target=sum(nums)/k ,这个值必须为整数,否则也不符合题意,另外,还有一种情况比较特殊,就是如果数组中的某个值大于target,那肯定也不能满足题意,直接返回false。接下来就是我们应该如何选择每个子集的元素,我们先不想如何写代码,如果让我想的话,先将数组中的元素从第一个开始遍历,原创 2020-09-13 18:22:07 · 424 阅读 · 0 评论 -
力扣之递归——所有可能的满二叉树
所有可能的满二叉树这道题是求:在给定节点N的个数的情况下,列出所有满二叉树的情况。例如:N=1或者3的时候,只有一种情况,当N=5的时候,就有两种情况了。解题思路:此题的满二叉树要求每个节点恰好由0或者两个孩子节点,那么N只可能是奇数,如果是偶数的话,那么肯定会出现有一棵树只有一个孩子节点。满二叉树的构造,如果你为某个节点分配了一个左子节点,那么你必须为其分配一个右子节点。为了列出所有满二叉树的排列,我们可以为左子树分配x个节点,为右子树分配N-1-x,(这里的-1是为了减去根节点),然后类推原创 2020-09-13 10:16:50 · 254 阅读 · 0 评论 -
力扣之递归——数值的整数次方
数值的整数次方这道题乍一看很简单,就是用for循环就可以了吗,但是那样做的话就会超出时间限制,既然这题出现在递归,那么我们可以想一想如何使用递归解决这道题。首先来分析一下思路1)当exponent=0的时候,返回1;2)当exponent<0的时候,需要把他转化为正数才能方便计算,同时base要转化成1/base。3)当exponent>0的时候,分为两种情况,一种为奇数,一种为偶数当exponent为偶数的时候,只需要计算Power(base*base,exponent/2)原创 2020-09-09 09:12:10 · 169 阅读 · 0 评论 -
力扣之递归——重建二叉树
力扣之递归——重建二叉树这道题的思路就是清楚前续遍历与中序遍历之间的联系,怎样将两者联系起来,其实里面会有些规律,其实也不是规律,更多的前续遍历与中序遍历的实质。思路使用指针解决这道题只需要使用三个指针就可以了,分别是前序遍历中使用到的指针pre_start,它代表前续遍历开始的位置;还有两个中序遍历中使用的指针,分别为inStart,inEnd,代表着中序遍历开始和结束的位置,其实就是对中序遍历进行拆解。下面就用一张图来进行分析一下。他的前序遍历是:[3,9,8,5,2,20,15,7]他原创 2020-09-08 09:27:34 · 196 阅读 · 0 评论 -
力扣之递归——有效井字游戏
这是递归里的一题,等级为中等,这题的题意大概就是在规则范围内完成游戏即可,输赢或者平局只有这三种情况,这里不能出现犯规情况,否则就返回false。分类讨论考虑井字游戏板生效的必要条件:因为所有的玩家轮流放棋,所以X的数量一定大于等于O的数量获胜的玩家一定在自己放棋后赢得比赛1)如果是第一个玩家获胜,则X的数量比O多12)如果是第二个玩家获胜,则X的数量与O相等游戏板上不可能同时出现3个X在一行并且3个O在另一行。因为一旦有玩家获胜,游戏结束,另一名玩家不能再放棋。下面上代码.原创 2020-09-06 14:05:35 · 335 阅读 · 0 评论 -
力扣之递归——二叉搜索树节点最小距离
二叉搜索树节点最小距离这题的思路很容易想得到,那就是中序遍历然后相邻值逐一计算,得出最小值,显然这里的递归主要是用在中序遍历上,那么在中序遍历的同时如何能兼顾的到计算呢,其实也很简单,只需要设置一个前驱指针,随着递归的进行不断地移动,代码如下/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; *原创 2020-09-05 14:04:05 · 141 阅读 · 0 评论 -
力扣之递归——汉诺塔问题
这是一道经典的算法题,汉诺塔就是用分治还有递归思想。下面来看解题思路分治思想首先我们拿A上只有两个盘子这种情况做模拟,发现只有一下三步将A上面的盘子放到B将A上面的盘子放到C将B上面的盘子放到C然后我们需要将A上只有两个盘子这种情况推广到A上有N个盘子,也分为一下散步将A上面的N-1个盘子放到B中将A上面的第N个盘子放到C中将B上面的N-1个盘子放到C中边界情况,当A中只有一个盘子将A上面的盘子放到C中下面上代码public void hanota(List<I.原创 2020-09-05 13:37:34 · 414 阅读 · 0 评论 -
力扣之递归——最长同值路径
力扣之递归——最长同值路径先来看看题目吧这题的解题思路还是比较巧妙的,就是感觉是那种隔山打牛的招式,下面来分析一波首先,以一个简单的二叉树作为例子如果以某个节点作为根节点寻找最长同值路径,图中的(2),这种是我们比较容易想到的,但是还有一种情况就是,如(1),以某个节点作为中间节点来寻找最长同值路径,这两种情况看着联系不到一起,但是一种巧妙地思路就可以将两者互相联系在一起,思路是就是先求情况(2)那种情形,但是情况(2)是情况(1)的一部分,先上代码吧,太难解释了,递归是自底向上,自左向右/原创 2020-09-04 14:15:54 · 284 阅读 · 0 评论 -
力扣之递归——青蛙跳台阶问题
力扣之递归——青蛙跳台阶问题这道题的的基本思路就是斐波那契,可能一眼不能看出来,需要先分析以下,此类求多少种可能性的题目一般都是有递推的,就是f(n),f(n-1),f(1)之间是有联系的。设青蛙跳上n级阶梯的方法有f(n)种,最后一步只有两种情况,跳一级或者跳两级,1.当为1级台阶:剩n-1级台阶,有f(n-1)种跳法;2.当为2级台阶:剩n-2级台阶,有(n-2)种跳法;所以f(n)=f(n-1)+f(n-2),这符合斐波那契数列,所以这题最后结果的求值就变成求斐波那契数列的第n项,只不过原创 2020-09-02 09:26:38 · 552 阅读 · 0 评论 -
力扣之递归——斐波那契数列
力扣之斐波那契数列这道题的等级依然为简单,题型为递归,但是不递归也可以递归解决斐波那契数列的代码比较简单,如下public int fib(int n){if(n<2){return n;}return fib(n-1)+fib(n-2);}这段代码有个问题,这样递归在数据量很大的时候,计算量就相当的大了,因为需要重复计算很多,如下图这里相同颜色的都是重复计算的数值,当n很大的时候,重复计算的值就越多,所以我们可以利用一个map把计算过的值保存起来,每次计算之前先在map集合原创 2020-09-01 08:54:40 · 265 阅读 · 1 评论 -
力扣之递归——二叉搜索树的范围和
二叉搜索树的范围和这道题的我一开始的思路就是中序遍历取出所有数据,然后再挑选,但是这样的效率很低,而且代码量相对较多既然题型是递归,当然需要使用到递归,基本思想是分为三个步骤:1.如果root.val<L,那么符合条件的范围的值就是在root的右子树2.如果root.val>R,那么符合条件的范围的值就是在root的左子树3.如果L<=root.val<=R,那么符合条件的值就是在root的左子树和右子树根据这个思路,很容易想到该如何进行递归,下面上代码class S原创 2020-08-31 09:21:01 · 116 阅读 · 0 评论 -
力扣之平衡二叉树
平衡二叉树的题,等级为简单先来看看题把这题有两种解法,分别是自下向上和自上向下,都是采用递归,但是效率会有所差别,时间复杂度还是差别蛮大的首先来看看自下而上的方法自底向上递归的方式类似于后序遍历,对于当前遍历到的节点,先递归的判断其左右子树是否平衡,在判断以当前节点为根的子树是否平衡,如果一棵子树是平衡的,就返回其高度,如果一棵子树不平衡,就返回-1,有一颗子树不平衡,那么整棵二叉树一定不平衡。下面,我们来上代码class Solution { public boolean isBal原创 2020-08-30 09:23:39 · 189 阅读 · 0 评论 -
AVL树(平衡二叉树)
平衡二叉树在创建一棵二叉排序树的时候,我们会发现一种比较极端的情况,就是给你的一个有序数列,然后创建一棵二叉排序树,创建的结果就是根节点的左子树或者右子树其中一个的深度为空,另一个深度很大,此时的二叉排序树就像一个有序的单链表,此时的查找效率就不是我们想要的了,这就很尴尬了,所以此时此时引入平衡二叉树就是为了保证在任何情况下保证二叉查找树的查找效率,平衡二叉树的定义为:树本身为一棵空树或者它的左右两个子树的高度差不超过1,并且左右两颗子树都是平衡二叉树。在二叉查找树的基础上完成平衡二叉树会有几种原创 2020-08-29 16:43:46 · 71 阅读 · 0 评论 -
力扣之二叉排序树转单链表
二叉排序树转单链表今天刷了一道力扣,等级为简单,思路也比较容易想到,但是我没写出来,哈哈哈哈。题目如下:其实思路很简单,就是中序遍历然后转成单链表吗,可是题目要求转换操作应该是原址的,就是在二叉排序树本身直接进行转换,这就稍微有点困难了。解决这道题中心思想就是中序遍历,可以采用递归,也可以非递归,非递归效率相较于递归低很多。递归public Node convertBiNode(Node root) { Node head = new Node(0);// 单链表的头指针哨兵原创 2020-08-24 17:14:27 · 285 阅读 · 0 评论 -
二叉查找树(二叉排序树)
二叉查找树二叉树的一个重要应用就是在查找中的使用。下面,先来看一个小例子:给你一个数列(7,3,10,12,5,1,9),要求能够高效的完成对数据的查询和添加,对数据进行这样的处理的方式有很多,例如,数组和链表。首先,来分析数组和链表的优点和缺点1.数组:数组可以分为两种情况(是否进行了排序):(1)未排序数组:数组查找速度慢,添加直接添加在数组尾部,比较快(2)已排序数组:数组查找时可以使用二分查找,查找速度较快,但是插入数据时为了保证数组有序,在插入位置之后的数据均要进行位置移动,比较缓慢。原创 2020-08-23 20:12:30 · 173 阅读 · 0 评论 -
赫夫曼编码之解压
当我们需要的字符串完成压缩之后,也就是完成赫夫曼编码之后,字符串所需要的编码位数变小了,这样有利于文件的传送,但是光压缩也没有用,如果不能解压的话,那接收方收到的压缩文件将 会无法打开,所以接下来,我们将完成下一步——赫夫曼编码的解压过程...原创 2020-08-03 11:27:21 · 129 阅读 · 0 评论 -
赫夫曼编码之压缩
赫夫曼编码原创 2020-07-16 14:08:46 · 158 阅读 · 0 评论 -
赫夫曼树
赫夫曼树关于赫夫曼树,我们先要了解几个名词,它们分别是:1.路径与路径长度:在一棵树中,从一个节点往下可以到达它的孩子或孙子节点之间的通路称为路径。通路中分支的数目称为路径长度,若规定根节点的层数为1,则L层到根节点之间的路径长度为(L-1)。2.节点的权与带权路径长度:若将树中的节点赋给某种含义的数值,则该数值称为该节点的权值。带权路径长度的定义为:从根节点到该节点的路径长度与该节点的权值的乘积。3.树的带权路径长度:该树的所有叶子结点的带权路径长度之和,记为WPL下面给出赫夫曼树的定义:给定原创 2020-07-16 14:06:35 · 141 阅读 · 0 评论