- 博客(190)
- 收藏
- 关注
原创 数据结构与算法(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
726
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
381
原创 数据结构与算法(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
384
原创 数据结构与算法(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
272
原创 数据结构与算法(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
706
原创 数据结构与算法(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
167
原创 数据结构与算法(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
180
原创 数据结构与算法(Java) 47:中位数
题目一个数据流中,随时可以取得中位数。思路同https://blog.csdn.net/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
375
原创 数据结构与算法(Java) 46:会议室安排
题目一些项目要占用一个会议室宣讲,会议室不能同时容纳两个项目的宣讲。 给你每一个项目开始的时间和结束的时间(给你一个数组,里面是一个个具体的项目),你来安排宣讲的日程,要求会议室进行的宣讲的场次最多。返回这个最多的宣讲场次。思路建立小根堆,将所有项目按开始时间start排序。从第一个项目开始遍历,假设第一个项目要进行宣讲,那么就看看第二项目的开始时间 是不是在第一个项目的结束时间 之后,如果是,那么第二个项目可以进行宣讲,否则跳过第二个项目。package algorithm.section7..
2020-05-25 19:29:30
950
原创 数据结构与算法(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
541
原创 数据结构与算法(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
627
原创 数据结构与算法(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
249
原创 数据结构与算法(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
198
原创 数据结构与算法(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
379
原创 数据结构与算法(Java) 40:并查集
思路一次性给定一个Node类型的列表。初始状态下,每个Node都自成一个集合,并且父节点以及这个集合的代表节点都是其自身。并查集的功能有两个:(1)(快速)查看两个元素是否属于同一个集合;(2)将两个元素各自所在的集合合并到一起。实现以上两个功能的方法:准备两张哈希表,parentMap和sizeMap。其中parentMap中key存放Node自身,value存放其父节点;sizeMap中key存放Node自身,value存放Node所在的集合的元素个数。对于功能(1),查看两个集合是否属于同一个集.
2020-05-16 20:20:31
283
原创 牛客网刷题(JAVA) 26:复杂链表的复制
难度系数⭐⭐难在思路时间限制C/C++ 1秒,其他语言2秒空间限制:C/C++ 32M,其他语言64M题目内容输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)。思路利用哈希表进行复制,其中哈希表中,key存放链表原节点,value存放复制节点(new一个新节点,值为key中节点的值,没有next以及ra...
2020-05-15 11:01:31
205
原创 牛客网刷题(JAVA) 25:二叉树中和为某一值的路径
难度系数⭐⭐⭐难在思路时间限制C/C++ 1秒,其他语言2秒空间限制:C/C++ 32M,其他语言64M题目内容输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。思路递归遍历,在每一次深入遍历时,目标数值将会变化,即目标数值-当前数值,若遍历至叶子节点,且此时目标数值变化为0,则该路径即为待查找的路径。package nowcoder;import java.util.Array...
2020-05-15 10:22:04
175
原创 牛客网刷题(JAVA) 24:二叉搜索树的后序遍历序列
难度系数⭐⭐⭐难在思路时间限制C/C++ 1秒,其他语言2秒空间限制:C/C++ 32M,其他语言64M题目内容输入一个非空整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。思路二叉搜索树,即以该树任意节点为根的子树,子树的左子树的数值都比根小,子树的右子树的数值都比根大。这是二叉搜索树的特征。结合后序遍历的特点,则该题解题思路是:数组最后一个数值是树的根节点,前边的数值左边部分属于左子树,且数值小于根节点...
2020-05-14 22:57:44
199
原创 数据结构与算法(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
227
原创 牛客网刷题(JAVA) 23:从上往下打印二叉树
难度系数⭐⭐时间限制C/C++ 1秒,其他语言2秒空间限制:C/C++ 32M,其他语言64M题目内容从上往下打印出二叉树的每个节点,同层节点从左至右打印。思路设置一个队列,遍历树,初始将根节点加入到队列中。当队列非空时,将队头元素弹出,判断弹出元素是否有左、右孩子,若有,则将其加入队列(注意顺序)。循环至队列为空结束。package nowcoder;import java.util.ArrayList;import java.util.LinkedList;impor...
2020-05-10 23:01:32
166
原创 牛客网刷题(JAVA) 22:栈的压入、弹出序列
难度系数⭐⭐时间限制C/C++ 1秒,其他语言2秒空间限制:C/C++ 32M,其他语言64M题目内容输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)思路设置两个指针分别指向当前在两个序列中的当前处理数据。设置一个栈结构,初始压入第一个...
2020-05-10 22:19:49
266
原创 牛客网刷题(JAVA) 21:包含min函数的栈
难度系数⭐⭐难在思路时间限制C/C++ 1秒,其他语言2秒空间限制:C/C++ 32M,其他语言64M题目内容定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。 注意:保证测试中不会当栈为空的时候,对栈调用pop()或者min()或者top()方法。思路设置两个栈,一个用于正常存储数据的栈stack,另一个用于记录当前栈中所有元素的最小值min。每次stack入栈时,min也入栈,但是在入栈的时候要比较待入栈的值与min顶部的数值,取...
2020-05-09 15:50:20
164
原创 牛客网刷题(JAVA) 20:二叉树的镜像
难度系数⭐⭐难在思路时间限制C/C++ 1秒,其他语言2秒空间限制:C/C++ 32M,其他语言64M题目内容操作给定的二叉树,将其变换为源二叉树的镜像。输入描述二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 5...
2020-05-08 22:01:45
172
原创 数据结构与算法(Java) 38:完全二叉树节点个数
题目已知一棵完全二叉树,求其节点的个数要求时间复杂度低于O(N),N为这棵树的节点个数思路沿左子树树的左节点遍历至底部,求出树的左子树高度;再沿右子树的左节点遍历至底部,求出右子树高度。如果右子树高度小于左子树高度,说明右子树部分是层数比左子树少1的满二叉树,递归计算左子树(必为完全二叉树)的节点个数,将其加到右子树节点个数,即:()+1(根)上;若左右子树高度相等,说明左子树部分是...
2020-05-07 23:09:08
346
原创 牛客网刷题(JAVA) 19:树的子结构
难度系数⭐⭐⭐难在思路时间限制C/C++ 1秒,其他语言2秒空间限制:C/C++ 32M,其他语言64M题目内容输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)思路递归实现。首先判断A树当前根节点是否与B树根节点值相同,若相同则判断B树是否含于以这个节点为根节点的A树,若含于则返回true,否则递归判断A树根节点的左子树与右子树。...
2020-05-05 23:12:28
189
原创 牛客网刷题(JAVA) 18:合并两个排序的链表
难度系数⭐时间限制C/C++ 1秒,其他语言2秒空间限制:C/C++ 32M,其他语言64M题目内容输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。思路依次对比两个链表的值,更小的值加入结果链表中。注意临界情况即可。package nowcoder;public class No19 { public static...
2020-05-05 22:11:31
193
原创 牛客网刷题(JAVA) 17:反转链表
难度系数⭐时间限制C/C++ 1秒,其他语言2秒空间限制:C/C++ 32M,其他语言64M题目内容输入一个链表,反转链表后,输出新链表的表头。思路设置两个指示指针pre和pos。可以理解为pre.next指向head头节点,head.next指向pos,利用三个指针的位置关系进行反转。画个图思路就明显了。package nowcoder;public class ...
2020-05-05 21:42:38
232
原创 牛客网刷题(JAVA) 16:重建二叉树
难度系数⭐⭐⭐难在思路时间限制C/C++ 1秒,其他语言2秒空间限制:C/C++ 32M,其他语言64M题目内容输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。思路前序遍历的首个节点必然是整...
2020-05-05 21:08:50
187
1
原创 数据结构与算法(Java) 37:搜索二叉树、完全二叉树
题目判断一棵树是否是搜索二叉树、判断一棵树是否是完全二叉树思路搜索二叉树,即以树中任意节点为根节点的子树,其左子树的值永远比根小,右子树的值永远比根大。判断方法:若一棵树为搜索二叉树,则该树中序遍历后是依次递增的。设置一个变量init用于记录两个数比较的最小值,若当前数值比init小,即出现非递增情况,则该树非搜索二叉树。 完全二叉树,即前N-1层是满的,第N层是从左到右...
2020-05-04 23:38:35
204
原创 数据结构与算法(Java) 36:平衡二叉树
题目判断一棵二叉树是否是平衡二叉树思路平衡二叉树,简单来说,二叉树所有的节点,其左子树与右子树的高度差不超过1,这样的二叉树就是平衡二叉树。满树一定是平衡二叉树,而平衡二叉树不一定是满二叉树。 递归求解。设置一个函数递归求解树的高度,高度为左子树与右子树中高度更高的值。递归判断当前子树是否是平衡二叉树,若递归过程出现左右子树高度差大于1的情况,则直接返回false,否则继续...
2020-05-04 07:55:01
187
原创 数据结构与算法(Java) 35:折纸问题
题目请把一段纸条竖着放在桌子上,然后从纸条的下边向上方对折1次,压出折痕后展开。此时 折痕是凹下去的,即折痕突起的方向指向纸条的背面。如果从纸条的下边向上方连续对折 2 次,压出折痕后展开,此时有三条折痕,从上到下依次是下折痕、下折痕和上折痕。 给定一 个输入参数N,代表纸条都从下边向上方连续对折N次, 请从上到下打印所有折痕的方向。 例如:N=1时,打印: down N=2时,打印: down...
2020-05-03 17:56:09
899
原创 数据结构与算法(Java) 34:二叉树的序列化和反序列化
简单来说,二叉树的序列化就是将二叉树用一个字符串来表示,反序列化就是将字符串还原回树结构。1. 先序序列化及其反序列化:在先序遍历过程中,若当前节点非空,则将其数值加入字符串(value值加一条下划线,用来分离不同数值),若当前节点为空节点,则在字符串中加入“#_”。2.中序以及后序序列化及其反序列化同先序方法。3. 按层序列化及其反序列化:【顾名思义,就是一层一层来序列化二叉树】...
2020-05-03 17:26:39
270
原创 牛客网刷题(JAVA) 16:链表中倒数第k个结点
难度系数⭐时间限制C/C++ 1秒,其他语言2秒空间限制:C/C++ 32M,其他语言64M题目内容输入一个链表,输出该链表中倒数第k个结点。思路首先遍历一下链表,记录链表长度。然后倒数第k个节点,即第len-k+1个节点。package nowcoder;public class No16 { public static class ListNode {...
2020-04-29 20:56:17
170
原创 数据结构与算法(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
271
原创 如何直观的打印一颗二叉树[直接用]
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
307
原创 数据结构与算法(Java) 32:二叉树遍历
题目实现二叉树的先序、中序、后序遍历,包括递归方式和非递归方式。思路递归:过于简单,不需要表述。 非递归:(1)先序遍历【根左右】,设置一个辅助栈,先将根节点放到栈中。栈非空时,遍历剩余部分。遍历时,先弹出栈顶元素,输出,并判断该元素的右孩子节点是否为空,若非空则压入栈中;再判断左孩子节点是否为空,若非空则压入栈中。 (2)...
2020-04-28 17:15:16
129
原创 数据结构与算法(Java) 31:两个单链表相交的一系列问题⭐⭐⭐⭐
题目在本题中,单链表可能有环,也可能无环。给定两个单链表的头节点 head1和head2,这两个链表可能相交,也可能不相交。请实现一个函数, 如果两个链表相交,请返回相交的第一个节点;如果不相交,返回null 即可。要求:如果链表1 的长度为N,链表2的长度为M,时间复杂度请达到 O(N+M),额外 空间复杂度请达到O(1)。思路考察3个知识点:(1)单链表是否有环;(2)两条单链表是...
2020-04-27 15:55:11
209
原创 数据结构与算法(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
159
原创 数据结构与算法(Java) 29:将单向链表按某值划分成左边小、中间相等、右边大的形式
题目给定一个单向链表的头节点head,节点的值类型是整型,再给定一个 整数pivot。实现一个调整链表的函数,将链表调整为左部分都是值小于 pivot 的节点,中间部分都是值等于pivot的节点,右部分都是值大于 pivot的节点。 除这个要求外,对调整后的节点顺序没有更多的要求。 例如:链表9->0->4->5- >1,pivot=3。 调整后链表可以是1->0-...
2020-04-25 23:22:49
487
原创 数据结构与算法(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
351
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人