
数据结构与算法(Java)
Dorothy_Xue
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
数据结构与算法(Java) 54:数值累加
题目给你一个数组arr,和一个整数aim。如果可以任意选择arr中的数字,能不能累加得到aim,返回true或者false。思路【暴力递归】类似于子序列问题,遍历数组,当前数值可以选择要它,或者不要它。【动态规划】设计一张二维dp表,行代表arr中的每一个数的位置,共arr.length + 1行(包含了越界位);若数组中全部元素的加和为sum,那么列代表范围是0~sum的加和。根据basecase可以看出,当sum=aim时,返回true,所以dp中最后一行(越界位)dp[arr.length..原创 2020-05-31 21:31:05 · 828 阅读 · 2 评论 -
数据结构与算法(Java) 53:最小的路径和
题目给你一个二维数组,二维数组中的每个数都是正数,要求从左上角走到右下角,每一步只能向右或者向下。沿途经过的数字要累加起来。返回最小的路径和。思路【暴力递归】(i, j)位置的最小路径应为:当前位置的值 + Min((i+1,j),(i,j+1));若j处于矩阵右边缘,则(i, j)位置的最小路径应为:当前位置的值 + (i+1,j);若i处于矩阵底部,则(i, j)位置的最小路径应为:当前位置的值 + (i,j+1);若i,j处于最后一个元素的位置,则直接返回最后一个元素的值。【动态规划】根据..原创 2020-05-30 16:08:29 · 471 阅读 · 0 评论 -
数据结构与算法(Java) 52:母牛的数量
题目母牛每年生一只母牛,新出生的母牛成长三年后也能每年生一只母牛,假设不会死。求N年后,母牛的数量。思路第一年:A第二年:A B(A生)第三年:A B(A生)C(A生)第四年:A B(A生) C(A生)D(A生)第五年:A B(A生) C(A生) D(A生) E(A生) F(B生)第六年:A B(A生) C(A生) D(A生) E(A生) F(B生) G(A生) H(B生) I(C生)... ...第N(>3)年母牛的数量f(N)=前一年母牛的数量[因为都没...原创 2020-05-27 17:40:09 · 457 阅读 · 0 评论 -
数据结构与算法(Java) 51:字符串全排列
题目输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出来的所有字符串abc、acb、bac、bca、cab和cba。思路遍历字符串(i),固定当前第i个字符,然后对剩下地i+1~n的字符进行全排列。由于第i个字符可以在 除了固定的字符之外的所有字符中(i~n)产生,所以要对这部分字符进行遍历交换位置。例图(源于网络,侵删):package algorithm.section8;public class Print_All_Permutations { ..原创 2020-05-26 18:00:34 · 338 阅读 · 0 评论 -
数据结构与算法(Java) 50:字符串全部子序列
题目打印一个字符串的全部子序列,包括空字符串思路对于每个字符,存在要它和不要它两种情况。决策至最后一个字符,停止。package algorithm.section8;public class Print_All_Subsequences { public static void subs(char[] str, int i, String res) { if (i == str.length) { System.out.println(re..原创 2020-05-26 15:20:40 · 759 阅读 · 0 评论 -
数据结构与算法(Java) 49:汉诺塔问题
题目打印n层汉诺塔从最左边移动到最右边得全部过程思路一共有三根杆,左中右。起始时所有对象都在左杆,且要求下面的对象必须比上面的对象大。如果要移动n个对象,则需要先将上面n-1个移动到中杆上,然后将最底下的对象移动到右杆上,最后将n-1个从中杆上移动到右杆上。时间复杂度:package algorithm.section8;public class Hanoi { public static void hanoi(int N, String left, String mid, Str..原创 2020-05-26 14:44:53 · 210 阅读 · 0 评论 -
数据结构与算法(Java) 48:n!
题目求n!得结果【暴力递归,将问题转化为规模缩小了的同类问题的子问题】package algorithm.section8;public class Factorial { public static long getFactorial1(int n) { if (n == 1) return (long)n; return n * getFactorial1(n - 1); } public static long getFact..原创 2020-05-25 23:03:35 · 232 阅读 · 0 评论 -
数据结构与算法(Java) 47:中位数
题目一个数据流中,随时可以取得中位数。思路同https://blog.youkuaiyun.com/Dorothy_Xue/article/details/105348997只是此处的堆结构不是自己构造的。package algorithm.section7;import java.util.Arrays;import java.util.Comparator;import java.util.PriorityQueue;public class MedianQuick { priv...原创 2020-05-25 20:48:05 · 442 阅读 · 0 评论 -
数据结构与算法(Java) 46:会议室安排
题目一些项目要占用一个会议室宣讲,会议室不能同时容纳两个项目的宣讲。 给你每一个项目开始的时间和结束的时间(给你一个数组,里面是一个个具体的项目),你来安排宣讲的日程,要求会议室进行的宣讲的场次最多。返回这个最多的宣讲场次。思路建立小根堆,将所有项目按开始时间start排序。从第一个项目开始遍历,假设第一个项目要进行宣讲,那么就看看第二项目的开始时间 是不是在第一个项目的结束时间 之后,如果是,那么第二个项目可以进行宣讲,否则跳过第二个项目。package algorithm.section7..原创 2020-05-25 19:29:30 · 1028 阅读 · 0 评论 -
数据结构与算法(Java) 45:最大收益
输入:参数1:正数数组costs (成本);参数2:正数数组profits (纯利润) ;参数3:正数k ;参数4:正数mcosts[i]表示i号项目的花费,profits[i]表示i号项目在扣除花费之后还能挣到的钱(利润),k表示你不能并行、只能串行的最多做k个项目,m表示你初始的资金说明:你每做完一个项目,马上获得的收益,可以支持你去做下 一个项目。输出: 你最后获得的最大钱数。思路建立小根堆(依据costs排序);将所有能用当前本金m完成的项目移到大根堆(依据profits排序..原创 2020-05-24 18:53:23 · 617 阅读 · 0 评论 -
数据结构与算法(Java) 44:最小分割代价
题目一块金条切成两半,是需要花费和长度数值一样的铜板的。比如长度为20的 金条,不管切成长度多大的两半,都要花费20个铜板。一群人想整分整块金条,怎么分最省铜板? 例如,给定数组{10,20,30},代表一共三个人,整块金条长度为 10+20+30=60. 金条要分成10,20,30三个部分。 如果, 先把长度60的金条分成10和50,花费60再把长度50的金条分成20和30,花费50 一共花费110铜板。 但是如果, 先把长度60的金条分成30和30,花费60再把长度30金条分成10和20,花费30一共.原创 2020-05-23 22:50:20 · 731 阅读 · 0 评论 -
数据结构与算法(Java) 43:字典序排列
使到用贪心策略以及比较器。使用贪心策略,一定不要去抠贪心策略的正确性,证明很麻烦。对于字符串str1以及str2,在进行比较时需要比较str1+str2以及str2+str1谁大谁小,而不应该直接比较str1和str2谁大谁小。比如“ba”和"b"。如果直接比较的话得到的结果是“bba”,而最终的答案应该是“bab”。package algorithm.section7;import java.util.Arrays;import java.util.Comparator;publi原创 2020-05-23 19:19:10 · 298 阅读 · 0 评论 -
数据结构与算法(Java) 42:前缀树
package algorithm.section7;public class TrieTree { public static class TrieNode{ public int path; // 存放所有前缀经过该节点的次数 public int end; //存放以该节点为最后一个值的前缀数 public TrieNode[] next; // 以26个字母为例:记录哪个分支存放了节点 public TrieNod.原创 2020-05-22 22:15:00 · 234 阅读 · 0 评论 -
数据结构与算法(Java) 41:岛问题
题目一个矩阵中只有0和1两种值,每个位置都可以和自己的上、下、左、右 四个位置相连,如果有一片1连在一起,这个部分叫做一个岛,求一个 矩阵中有多少个岛?举例: 0 0 1 0 1 0 1 1 1 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0这个矩阵中有三个岛。思路遍历矩阵,若当前数值为1,则以当前元素为感染源,进行感染,并计数+1。感染过程即:递归查询当前元素的上下左右是否为1,若为1,则将数值改为2...原创 2020-05-16 20:41:48 · 441 阅读 · 0 评论 -
数据结构与算法(Java) 40:并查集
思路一次性给定一个Node类型的列表。初始状态下,每个Node都自成一个集合,并且父节点以及这个集合的代表节点都是其自身。并查集的功能有两个:(1)(快速)查看两个元素是否属于同一个集合;(2)将两个元素各自所在的集合合并到一起。实现以上两个功能的方法:准备两张哈希表,parentMap和sizeMap。其中parentMap中key存放Node自身,value存放其父节点;sizeMap中key存放Node自身,value存放Node所在的集合的元素个数。对于功能(1),查看两个集合是否属于同一个集.原创 2020-05-16 20:20:31 · 359 阅读 · 0 评论 -
数据结构与算法(Java) 39:设计RandomPool结构(哈希表)
题目设计一种结构,在该结构中有如下三个功能:insert(key):将某个key加入到该结构,做到不重复加入。delete(key):将原本在结构中的某个key移除。getRandom(): 等概率随机返回结构中的任何一个key。要求Insert、delete和getRandom方法的时间复杂度都是 O(1)。思路设置两个哈希表map1和map2,结构分别为<K, Integer>和<Integer, K>,设置一个整型记录哈希表当前大小。其中K是泛型,可以...原创 2020-05-12 23:01:13 · 275 阅读 · 0 评论 -
数据结构与算法(Java) 38:完全二叉树节点个数
题目已知一棵完全二叉树,求其节点的个数要求时间复杂度低于O(N),N为这棵树的节点个数思路沿左子树树的左节点遍历至底部,求出树的左子树高度;再沿右子树的左节点遍历至底部,求出右子树高度。如果右子树高度小于左子树高度,说明右子树部分是层数比左子树少1的满二叉树,递归计算左子树(必为完全二叉树)的节点个数,将其加到右子树节点个数,即:()+1(根)上;若左右子树高度相等,说明左子树部分是...原创 2020-05-07 23:09:08 · 406 阅读 · 0 评论 -
数据结构与算法(Java) 37:搜索二叉树、完全二叉树
题目判断一棵树是否是搜索二叉树、判断一棵树是否是完全二叉树思路搜索二叉树,即以树中任意节点为根节点的子树,其左子树的值永远比根小,右子树的值永远比根大。判断方法:若一棵树为搜索二叉树,则该树中序遍历后是依次递增的。设置一个变量init用于记录两个数比较的最小值,若当前数值比init小,即出现非递增情况,则该树非搜索二叉树。 完全二叉树,即前N-1层是满的,第N层是从左到右...原创 2020-05-04 23:38:35 · 250 阅读 · 0 评论 -
数据结构与算法(Java) 36:平衡二叉树
题目判断一棵二叉树是否是平衡二叉树思路平衡二叉树,简单来说,二叉树所有的节点,其左子树与右子树的高度差不超过1,这样的二叉树就是平衡二叉树。满树一定是平衡二叉树,而平衡二叉树不一定是满二叉树。 递归求解。设置一个函数递归求解树的高度,高度为左子树与右子树中高度更高的值。递归判断当前子树是否是平衡二叉树,若递归过程出现左右子树高度差大于1的情况,则直接返回false,否则继续...原创 2020-05-04 07:55:01 · 228 阅读 · 0 评论 -
数据结构与算法(Java) 35:折纸问题
题目请把一段纸条竖着放在桌子上,然后从纸条的下边向上方对折1次,压出折痕后展开。此时 折痕是凹下去的,即折痕突起的方向指向纸条的背面。如果从纸条的下边向上方连续对折 2 次,压出折痕后展开,此时有三条折痕,从上到下依次是下折痕、下折痕和上折痕。 给定一 个输入参数N,代表纸条都从下边向上方连续对折N次, 请从上到下打印所有折痕的方向。 例如:N=1时,打印: down N=2时,打印: down...原创 2020-05-03 17:56:09 · 984 阅读 · 0 评论 -
数据结构与算法(Java) 34:二叉树的序列化和反序列化
简单来说,二叉树的序列化就是将二叉树用一个字符串来表示,反序列化就是将字符串还原回树结构。1. 先序序列化及其反序列化:在先序遍历过程中,若当前节点非空,则将其数值加入字符串(value值加一条下划线,用来分离不同数值),若当前节点为空节点,则在字符串中加入“#_”。2.中序以及后序序列化及其反序列化同先序方法。3. 按层序列化及其反序列化:【顾名思义,就是一层一层来序列化二叉树】...原创 2020-05-03 17:26:39 · 324 阅读 · 0 评论 -
数据结构与算法(Java) 33:在二叉树中找到一个节点的后继节点
题目现在有一种新的二叉树节点类型如下:public static class Node{ public int value; public Node left; public Node right; public Node parent; public Node(int data){ ...原创 2020-04-28 18:16:17 · 313 阅读 · 0 评论 -
如何直观的打印一颗二叉树[直接用]
package algorithm.section5;public class PrintBinaryTree { public static class Node { public int value; public Node left; public Node right; public Node(int data...原创 2020-04-28 17:28:38 · 354 阅读 · 0 评论 -
数据结构与算法(Java) 32:二叉树遍历
题目实现二叉树的先序、中序、后序遍历,包括递归方式和非递归方式。思路递归:过于简单,不需要表述。 非递归:(1)先序遍历【根左右】,设置一个辅助栈,先将根节点放到栈中。栈非空时,遍历剩余部分。遍历时,先弹出栈顶元素,输出,并判断该元素的右孩子节点是否为空,若非空则压入栈中;再判断左孩子节点是否为空,若非空则压入栈中。 (2)...原创 2020-04-28 17:15:16 · 164 阅读 · 0 评论 -
数据结构与算法(Java) 31:两个单链表相交的一系列问题⭐⭐⭐⭐
题目在本题中,单链表可能有环,也可能无环。给定两个单链表的头节点 head1和head2,这两个链表可能相交,也可能不相交。请实现一个函数, 如果两个链表相交,请返回相交的第一个节点;如果不相交,返回null 即可。要求:如果链表1 的长度为N,链表2的长度为M,时间复杂度请达到 O(N+M),额外 空间复杂度请达到O(1)。思路考察3个知识点:(1)单链表是否有环;(2)两条单链表是...原创 2020-04-27 15:55:11 · 241 阅读 · 0 评论 -
数据结构与算法(Java) 30:复制含有随机指针节点的链表
题目一种特殊的链表节点类描述如下:public static class Node{ public int value; public Node next; public Node random; public Node(int value){ this.value = value; ...原创 2020-04-26 21:14:42 · 195 阅读 · 0 评论 -
数据结构与算法(Java) 29:将单向链表按某值划分成左边小、中间相等、右边大的形式
题目给定一个单向链表的头节点head,节点的值类型是整型,再给定一个 整数pivot。实现一个调整链表的函数,将链表调整为左部分都是值小于 pivot 的节点,中间部分都是值等于pivot的节点,右部分都是值大于 pivot的节点。 除这个要求外,对调整后的节点顺序没有更多的要求。 例如:链表9->0->4->5- >1,pivot=3。 调整后链表可以是1->0-...原创 2020-04-25 23:22:49 · 534 阅读 · 0 评论 -
数据结构与算法(Java) 28:判断一个链表是否为回文结构
题目给定一个链表的头节点head,请判断该链表是否为回 文结构。 例如: 1->2->1,返回true。 1->2->2->1,返回true。 15->6->15,返回true。 1->2->3,返回false。进阶如果链表长度为N,时间复杂度达到O(N),额外空间复杂 度达到O(1)。思路(1)额外空间复杂度O(N):将链表的值...原创 2020-04-23 23:59:22 · 391 阅读 · 0 评论 -
数据结构与算法(Java) 27:打印两个有序链表的公共部分
题目给定两个有序链表的头指针head1和head2,打印两个 链表的公共部分。思路类似与归并排序中的外排。package algorithm.section4;public class PrintCommonPart { public static class Node{ int value; Node next; pu...原创 2020-04-22 22:45:24 · 318 阅读 · 0 评论 -
数据结构与算法(Java) 26:在行列都排好序的矩阵中找数
题目给定一个有N*M的整型矩阵matrix和一个整数K,matrix的每一行和每一列都是排好序的。实现一个函数,判断K是否在matrix中。 例如: 0 1 2 5 2 3 4 7 4 4 4 8 5 7 7 9 如果K为7,返回true;如果K为6,返回false。要求时间复杂度为O(N+M),额外空间复杂度为O(1)。思路从矩阵右上角(或左下角)开始遍历。以从右上角开始遍历为例:...原创 2020-04-22 22:29:22 · 276 阅读 · 0 评论 -
数据结构与算法(Java) 25:“之”字形打印矩阵
题目给定一个矩阵matrix,按照“之”字形的方式打印这 个矩阵,例如:1 2 3 45 6 7 89 10 11 12“之”字形打印的结果为:1,2,5,9,6,3,4,7,10,11, 8,12要求额外空间复杂度为O(1)。思路设起始点为[0,0]坐标处的点。设置两个游走点A和B,起始都位于[0,0]。每一次A往右走一步,B往下走一步,二者连成一条对角线为待打印的...原创 2020-04-22 22:00:26 · 272 阅读 · 0 评论 -
数据结构与算法(Java) 24:反转单向和双向链表
题目分别实现反转单向链表和反转双向链表的函数。要求如果链表长度为N,时间复杂度要求为O(N),额外空间 复杂度要求为O(1).思路设置两个指针分别指向当前节点的前一个结点和后一个节点,且初始位置为头节点前面的一个空节点。利用2个指针对节点的next方向进行改变。package algorithm.section4;public class ReverseList { ...原创 2020-04-21 22:45:56 · 246 阅读 · 0 评论 -
数据结构与算法(Java) 23:旋转正方形矩阵
题目给定一个整型正方形矩阵matrix,请把该矩阵调整成顺时针旋转90度的样子。要求额外空间复杂度为O(1)。思路一圈儿一圈儿的转,类似于旋转打印矩阵。用递归方法实现。package algorithm.section4;public class RotateMatrix { public static void rotate(int[][] matrix){ ...原创 2020-04-21 21:26:11 · 339 阅读 · 0 评论 -
数据结构与算法(Java) 22:转圈打印矩阵
题目给定一个整型矩阵matrix,请按照转圈的方式打印它。 例如:1 2 3 45 6 7 89 10 11 1213 14 15 16打印结果为:1,2,3,4,8,12,16,15,14,13,9, 5,6,7,11, 10要求额外空间复杂度为O(1)。思路递归地一圈一圈打印。package algorithm.section4;public cla...原创 2020-04-20 23:27:34 · 212 阅读 · 0 评论 -
数据结构与算法(Java) 21:猫狗队列
题目宠物、狗和猫的类如下:public class Pet { private String type; public Pet(String type) { this.type = type; } public String getPetType() { return thi...原创 2020-04-20 22:47:09 · 313 阅读 · 0 评论 -
数据结构与算法(Java) 20:栈和队列相互实现
题目如何仅用队列结构实现栈结构? 如何仅用栈结构实现队列结构?1. 用队列实现栈:思路设置两个队列queue1和queue2实现(共有N个数):① push操作相同;② pop操作时,将queue1中前N-1个数push进queue2中,返回剩余的最后一个值;queue2与queue1交换一下,即可完成。③ peek操作类似与pop操作,只不过是需要将最后一个值也push进...原创 2020-04-17 23:41:14 · 196 阅读 · 0 评论 -
数据结构与算法(Java) 19:特殊栈
题目实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。要求1.pop、push、getMin操作的时间复杂度都是O(1)。 2.设计的栈类型可以使用现成的栈结构。思路设置两个栈,一个(data)用于正常使用,另一个(min)用于“实时”记录当前栈中元素最小值。若data入栈,min也入栈【min中的值入栈时取:当前栈顶元素和待入栈值,二者中...原创 2020-04-17 22:45:43 · 206 阅读 · 0 评论 -
数据结构与算法(Java) 18:栈和队列
题目用数组结构实现大小固定的队列和栈1. 栈思路:设置一个指针指向当前位置,若入栈,则往指针指向的位置存入数据,指针指向下一个位置;若出栈,则输出当前位置的数据,并将指针前移一位。package algorithm.section3;public class ArrayToStack { Integer size; Integer[] array; ...原创 2020-04-17 22:09:31 · 206 阅读 · 0 评论 -
数据结构与算法(Java) 17:桶排序的应用[含对数器]⭐⭐⭐
题目给定一个数组,求如果排序之后,相邻两数的最大差值,要求时 间复杂度O(N),且要求不能用非基于比较的排序。思路应用桶排序,但是要基于排序来操作。步骤如下:(1)遍历数组,找出数组的最大值max和最小值min,若max==min则说明数组中数字相同,返回0;(2)以min和max为区间端点,均等划分arr.length+1个桶(可以理解为区间);(3)遍历数组,若当前数字属于...原创 2020-04-12 21:42:02 · 227 阅读 · 0 评论 -
数据结构与算法(Java) 16:比较器
在工程上,如果一个数组特别大,工程上会先判断这个数组中装的数据类型。如果数据类型是基本类型(int, float, double等),则使用快排,因为不需要保证稳定性,基本类型,数值相同,无差异;如果数据类型是自己定义的class,则使用归并排序,因为需要保证稳定性。那么在对自己定义的类型的数据进行排序时,根据什么来排序呢?按照哪个字段来?就需要用到比较器。例如:package sectio...原创 2020-04-10 21:14:59 · 223 阅读 · 0 评论