![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法与数据结构
文章平均质量分 87
fucccck_ly
这个作者很懒,什么都没留下…
展开
-
力扣CV工程师刚学的拓扑排序!包教包会!
力扣CV工程师刚学的拓扑排序!包教包会!何为拓扑排序?拓扑排序例题Leetcode 207 课程表Leetcode 1203 项目管理其他例子何为拓扑排序?所谓拓扑排序,是有向无环图才有的一种排序。对于一个给定的包含n个节点的有向图G,我们给出它的节点编号的一种排列,如果满足:对于图G中的任意一条有向边(u,v),u在排列中都出现在v的前面。那么就称该排列是图G的拓扑排序。第一次读拓扑排序的概念可能会感觉难以理解,从这个概念上出发,我们需要捋清楚的问题是为什么只有有向无环图才有拓扑排序?原因很简单原创 2021-01-12 22:47:27 · 214 阅读 · 0 评论 -
子集划分是个什么东西?背包问题->动态规划?
子集划分是个什么东西?背包问题->动态规划?子集划分问题抽取子集划分问题解决思路其他题目子集划分问题抽取以上题目来自力扣494.目标和,本篇文章的重点在于提取出其中的一种类型问题,称为子集划分问题。所谓子集划分问题,是一个典型的背包问题,而背包问题,使用的是动态规划来解决。此题可以使用回溯方法来做,但由于一些重复的计算,时间复杂度会很高,因此可以转化为背包问题从而使用动态规划来解决来降低复杂度。子集划分问题解决思路子集划分问题,其实就是我们把nums数组分成两个子集A和B,分别代表分配+和原创 2020-11-13 23:59:40 · 551 阅读 · 0 评论 -
Java实现快速幂
Java实现快速幂//平平无奇实现法public long normalPower(long base,long power){ long result=1; for(int i=0;i<power;i++){ result*=base; } return result;}//快速幂实现法public long normalPower(long base,long power){ long result=1; while(power>0){ if(power%2=原创 2020-09-20 23:34:34 · 1205 阅读 · 0 评论 -
答应我 你一定要学会字典树!!字典树+Java实现+Leetcode题目--回文对
答应我 你一定要学会字典树写在前面字典树详解字典树概念字典树特点字典树应用字典树具体实现(Java)Leetcode原题结合理解写在最后写在前面大概是一周前的每日一题吧,当初初遇字典树,惊讶于其精妙,昨晚睡前的时候又看到字典树用于解决最长公共子前缀问题,想想具体实现,发现又给忘了,故今日抓紧时间整理,方便日后查看。本文章包括字典树概念的说明、使用场景以及leetcode题解的具体分析。字典树详解字典树概念先上个图,此图来自维基百科,先看看较为官方的定义:在计算机科学中,trie,又称前缀树或字原创 2020-08-18 11:52:05 · 168 阅读 · 0 评论 -
整理了一道并查集的问题
并查集 看起来可以解决一些关于无向图的问题看看这一篇博客 并查集的理解和Java实现我在博主的基础上实现了输出package Aut;import java.util.*;/** * 并查集的思路解决 */public class meituan3 { //parent[1]=0表示1的父节点是0 若出现parent[2]=2,表示2是根节点 public static int[] parent=new int[1000]; public static void原创 2020-08-16 00:01:36 · 115 阅读 · 0 评论 -
常用排序算法(二)---优雅地用Java实现堆排序吧!!
关于堆排序 相信有很多博客都讲得很细很细了堆排序的思路还是比较好理解的 也是面试经常考查的点 因此我觉得把堆排序给啃下来然而 图解堆排序的博客很多 但是堆排序的代码实在是写得太复杂了 我一个菜鸡实在是很难理解花费了一整个下午的时间 把堆排序的代码给整理出来了 附上详尽的注释 相信看着这份代码 对照着图解 很多就能把堆排序掌握下来啦!以下附上代码:(可能不是想象的那么优雅 但力求简单易懂好吧!)package Aug;import java.util.Arrays;/** * 堆排序 *原创 2020-08-14 18:05:51 · 111 阅读 · 0 评论 -
Java实现 数组转化为完全二叉树并进行前序、中序和后序遍历
Java实现 数组转化为完全二叉树并进行前序、中序和后序遍历数组转化成完全二叉树前序遍历递归版本非递归版本中序遍历递归版本非递归版本后序遍历递归版本非递归版本运行结果数组转化成完全二叉树/**由数组构建完全二叉树 *一棵由数组构建的完全二叉树,下标为n的节点左右子树分别是2n+1和2n+2 */ public static TreeNode createBinaryT...原创 2020-05-05 18:25:08 · 910 阅读 · 0 评论 -
Leetcode——解数独
题目描述题目分析建议食用本题前先看看36.有效的数独,解数独也使用到该题里面如何判断重复的思路。本题用到的是回溯的思路,所谓回溯,其实就是在进行一步操作之后,违反了规则,而进行情景恢复的步骤,换句话说,回溯就是把你刚做的操作撤销,回到操作之前的样子,类似于Ctrl+Z。我们通过回溯的方法,对每一个格子填入1-9进行尝试,如果成功就进行下一步,失败即进行回溯,回到上一步。要填入一个数,...原创 2020-04-14 16:11:40 · 153 阅读 · 0 评论 -
Leetcode_翻转字符串里的单词
题目描述题目分析这道题用一些Java自带的方法还是比较容易解决的,主要问题还在在于对方法的不熟悉。题目解答class Solution { public String reverseWords(String s) { if(s==null && s.length()==0 ) return null; //除去前导空白和后续空白 ...原创 2020-04-10 17:48:35 · 90 阅读 · 0 评论 -
Leetcode——括号生成(深度优先遍历)
题目描述题目分析本题采用的是回溯算法(深度优先遍历算法),在看了一些博客之后,我对深度优先的理解是,往尽可能深的方向搜索,有点像二叉树的前序遍历,搜索停止的标志是到达边界或者找到结果。而之所以称为“回溯”,是在往一个方向搜索结束后,要跳转回上一节点,继续往其他方向搜索。在这一题中,由于字符串的每一次拼接都生成一个新的对象,因此不必回溯。到达每一个节点时,我们都有两种选择,一是加上左括号,...原创 2020-04-09 15:46:58 · 260 阅读 · 0 评论 -
Leetcode——重建二叉树
题目描述题目分析题目的要求很简单,给你两个数组,分别是前序遍历和中序遍历,要你还原二叉树。首先我们要明白的是二叉树的前序、中序以及后序遍历的区别以及特点,大家可以自行去网上搜索,相信有很多博主写的文章都能帮助理解。而我个人的理解方法呢,主要从名字入手,前序遍历,就是根节点在前头,然后再左右,就是根-左-右的顺序遍历;中序遍历呢,就是根节点在中间,也就是左-根-右的顺序;而后序遍历呢,就是...原创 2020-04-06 17:09:29 · 167 阅读 · 0 评论 -
Leetcode——地图分析
题目描述题目分析本题使用的思想是图的广度优先搜索(BFS),我们需要从陆地开始,向四周开始搜索,每次搜索都为海洋加上值,返回最后一次搜索的海洋的值即为所求的最大距离。树的BFS只有一个源点,但图的源点有多个,因此我们要用一个队列来保存他们,此题中的源点就是陆地的位置和他们所遍历过的海洋。刚开始的时候,源点应该是所有的陆地,以陆地为中心点向四个方向扩散,扩散到的地方打上标记,再把他们放入队...原创 2020-03-30 01:27:13 · 234 阅读 · 0 评论 -
Leetcode——卡牌分组
题目描述题目分析本题的要求是让我们把一个有重复数的数组分成若干组,而这些组至少也要有2个数;到此我们能找到两种特殊情况:如果原数组的长度小于2或者数组中某一个数的个数为1的话,那肯定是不可能满足要求的。我们可以先获取每个数的个数,然后通过判断这些个数的最大公约数是否大于1即可。注意,在第一次循环之后,x已经变成了两个数的最大公约数。还有一点是最大公约数的求解,我们可以通过辗转相除法来...原创 2020-03-27 11:44:18 · 121 阅读 · 0 评论 -
LeetCode——三维形体的表面积
题目描述题目分析刚开始很不理解题意,通过题解里面大神画的图片,终于理解题意,二维数组表示的是一个位置,该位置所存数据就是小正方体的个数,可以想象是你面对着一张纸,而小正方体往你的方向堆叠,求的是所形成的三维形体的表面积。我们通过分类每一个位置所提供的表面积数然后加起来获得结果。当目标位置不为0的时候,那么必定会有上下两个面,而它的4个侧面,取决于目标位置上下左右的情况,如果某一面相邻位...原创 2020-03-25 21:30:54 · 135 阅读 · 0 评论 -
Leetcode——按摩师
题目描述题目分析本题使用动态规划的方法,关于动态规划的思想入门,可参考这篇文章:动态规划入门,这一篇就够了将动态规划的思想应用在本题中,其实就是找出每个子数组中服务时间取最大的值。通过建立一个二维数组dp[i][j]来保存选择的情况,i代表的是第i+1天的情况,j的取值只有0或者1,代表是否选择接受预约请求。i=0时,表示第一天的情况,应该和后面的分类讨论。1<=i<=le...原创 2020-03-24 21:09:19 · 134 阅读 · 0 评论 -
求n的阶乘防止溢出——Java实现
写在前面昨晚做某公司笔试题的时候,遇见了一道需要排列组合的题目,由于n的取值是[1,500],因此肯定会出现整型溢出的问题。当时一时间没想出解决的方法,今天趁着有时间整理一下如何求解n的阶乘。分析Int的取值范围是- 2 147 483 647~2 147 483 647,当n=12时,n!=479 001 600,此时还没有溢出;当n=13时,n!=6 227 020 800,此时就会出...原创 2020-03-24 16:37:00 · 1243 阅读 · 0 评论 -
Leetcode-数组中重复的数
题目描述题目分析题目思路比较简单,只需要找其中一个有重复的数字输出就好,可以先把数组进行排序,然后比较相邻两个数是否相同就好。时间:O(nlogn) 空间:O(1)题目解答class Solution { public int findRepeatNumber(int[] nums) { if(nums==null||nums.length<=0) ...原创 2020-03-24 11:20:26 · 126 阅读 · 1 评论 -
Leetcode——LRU缓存
题目描述题目分析首先是LRU缓存思想,LRU(Least Recently Used,最近最少使用),顾名思义,是淘汰最近最少使用的项目,其思想是如果数据最近被访问过,那么将来被访问的几率更高此时第一个想的是使用一个链表,最近使用的放在最后面,最近没用的放在最前面,来了一个新的数,就判断内存是否满了,把最旧的数淘汰再加入新数。为了方便移动数据,应该使用链表。对于这个问题,一共有两个需求...原创 2020-03-23 15:44:06 · 99 阅读 · 0 评论 -
Leetcode——平衡二叉树
题目描述题目分析首先是平衡二叉树的定义,它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。先浮现在脑海中的是分别获取左右子树的深度,再对他们的差值进行比较。并且,每一个子树也必须是平衡的,因此也需要递归去判断他们。当然最先是特殊情况的处理,当树为空树时,它就是平衡的。而在每一个递归中,也需要判断是否为空。这个算法分成了两个方法,一个是判断树是否平...原创 2020-03-21 14:02:13 · 116 阅读 · 0 评论 -
Leetcode-回文数
题目描述判断一个int是否为回文数,回文数定义为首位置和末尾一样,如1234321,123321。题目分析刚开始想的是把数字翻转过来,然后跟原来的数字进行比较,但是要防止翻转后的数字会出现整型溢出的问题。所以不可以翻转全部,如果一个数是回文数,那么可以翻转他的后半部分跟前半部分进行比较。当然首先要考虑临界状态,负数带有符号,所以肯定不会是回文数。0肯定是个回文数,并且,当x最后一位是...原创 2020-03-21 01:00:57 · 122 阅读 · 0 评论 -
常用排序算法(一)---算法汇总
前言:在阅读了《算法第四版》排序部分后,由于很久没有看导致啥都忘记了,故在此对其中的算法原理以及Java实现整理一下,方便以后自己复习。选择排序对于选择排序,用比较官方的定义,是通过n-i次关键字间的比较,从n-i+1个记录里选出关键字最小的记录,并和第i(1<=i<=n)个记录进行交换。笼统一点呢,就是首先找到数组中最小的那个元素,其次,将他和数组的第一个元素交换位置(如果第...原创 2020-03-16 16:48:52 · 199 阅读 · 0 评论 -
Leetcode-快乐数
题目描述题目分析阅读题干,知道了只有在数等于1时才返回true,在数进入循环时要返回false,所以第一反应是使用不能存入重复数字的HashSet来存储并判断是否已经出现过。经检验,在1-4之间只有1是快乐数,而在大于5的数中,则会回归到1或者回归到4。题目解答第一种:暴力解法使用HashSet存储每一轮循环的数字并判断是否进入循环,利用递归解决第二种:改进式暴力解法由...原创 2019-11-26 10:49:07 · 92 阅读 · 0 评论 -
栈的定义以及用java实现栈的API的两种形式--链表和数组
栈的定义以及用java实现栈的API的两种形式–链表和数组最近在学习算法第四版,看网课的同时,才发现之前学数据结构的时候囫囵吞枣,没有领会到其中的精髓,故对栈的相关知识进行略微总结,如有不对之处请指出,谢谢!栈的定义栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,...原创 2019-07-18 20:46:42 · 313 阅读 · 0 评论