
算法
学习完左神视频的感悟与收获
一叶-小舟
这个作者很懒,什么都没留下…
展开
-
可以进行的最多宣讲次数
一些项目要占用一个会议室宣讲,会议室不能同时容纳两个项目的宣讲。 给你每一个项目开始的时间和结束的时间(给你一个数组,里面 是一个个具体的项目),你来安排宣讲的日程,要求会议室进行 的宣讲的场次最多。返回这个最多的宣讲场次。思路:这是一个贪心题。这道题我们贪心的策略是找到最早结束的宣讲会来进行选择。因为如果一个项目结束的较晚,其后面可以做的项目,在其之前结束的宣讲是一定可以做的,因此选择结束早的宣讲这样可以选择的次数一定是大于等于选择晚结束的次数的。package Code07;import jav原创 2020-05-17 19:00:19 · 297 阅读 · 0 评论 -
一个数据流中,随时可以取得中位数
思路:这题的思路就是利用两个堆来做。一个大根堆用来储存比较小的数据,以及一个小跟堆用来储存较大的数据。package Code07;import java.util.PriorityQueue;public class Code04_MedianQuick { public static void main(String[] args) { MedianHolder m = new MedianHolder(); m.addNumber(3);原创 2020-05-17 18:56:46 · 198 阅读 · 0 评论 -
可以获得的最大钱数
输入: 参数1,正数数组costs 参数2,正数数组profits 参数3,正数k 参数4,正数mcosts[i]表示i号项目的花费 profits[i]表示i号项目在扣除花费之后还能挣到的钱(利润) k表示你不能并行、只能串行的最多做k个项目 m表示你初始的资金说明:你每做完一个项目,马上获得的收益,可以支持你去做下一个 项目。输出: 你最后获得的最大钱数。思路:这是一个贪心的问题,我们可以先将花费小于等于m的所有项目给找出来,然后挑选里面利润最大的项目做,做完之后加上利润,我们在将总的资金可以做原创 2020-05-17 18:55:06 · 193 阅读 · 0 评论 -
切金条所需的最小代价
一块金条切成两半,是需要花费和长度数值一样的铜板的。比如长度为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-15 17:03:33 · 241 阅读 · 0 评论 -
前缀树
前缀树是将之前的信息给存到一棵树中,然后当下一个字符串加进来的时候,将其转化为字符数组,看看当前字符是否在这个前缀树中,若存在就经过那条路径,然后路径上的path加1,若不存在就新建一条路径。package Code07;public class Code01_TrieTree { public static class TrieNode{ public int path; public int end; public TrieNode[] ne原创 2020-05-15 10:25:24 · 75 阅读 · 0 评论 -
求完全二叉树的节点个数
已知一棵完全二叉树,求其节点的个数要求:时间复杂度低于O(N),N为这棵树的节点个数因为是完全二叉树,除了最后一层都是填满的,因此我们可以利用这个性质。首先求出这个二叉树最大的高度,然后求其右子树的最大高度,如果两者是相等的,就说明左边是填满的,我们可以直接计算数量,否则的话就说明右面的最大高度是h - 1,同时在h - 1层右子树的高度也是填满的。然后就进行递归来做。package Code04;public class Code08_NodeNumber { public stat原创 2020-05-13 18:23:36 · 640 阅读 · 0 评论 -
完全二叉树
完全二叉树是每层结点都完全填满,在最后一层上如果不是满的,则只缺少右边的若干结点。因此我们在判断是否是完全二叉树的时候我们可以分情况来进行讨论。一个节点有右孩子而没有左孩子 这显然是错的。当一个节点的孩子为空时,这时在同一层的后面的节点,如果有节点的孩子不全为空,则不是完全二叉树。package Code04;import java.util.LinkedList;import java.util.Queue;public class Code07_IsBSTAndCBT {原创 2020-05-13 17:42:46 · 2457 阅读 · 0 评论 -
搜索二叉树
判断一棵树是否为搜索二叉树搜索二叉树的特点是当前节点的值大于左子树的值,小于右子树的值。即中序遍历的结果为升序。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Solution { pu原创 2020-05-13 17:18:15 · 109 阅读 · 0 评论 -
二叉树的遍历
用递归的方式可以很方便的打印二叉树,因为在递归的调用中每个节点都会经过三次,根据到达节点的先后顺序我们就可以进行打印。用非递归的方式打印。先序遍历的时候,我们用一个栈来存储节点。如果一个节点存在右孩子我们就将右孩子给加进去,然后如果存在左孩子,就将左孩子给加进去。这样可以保证在弹出的时候是先弹出左孩子的,然后才是右孩子。后序遍历与先序遍历是相似的,需要将先序遍历的顺序给换过来,先加左孩子在加右孩子,然后用一个额外的栈去存储。中序遍历:也是用一个栈来存储节点。如果一个节点不为空就将这个节点给加..原创 2020-05-13 09:32:23 · 94 阅读 · 0 评论 -
桶排序及其应用
桶排序是一种不用比较的排序。适合需要排序的数据的数值不是很大且非负。思路:首先遍历一遍数组arr,将其中的最大值找出来。然后创建一个大小为max+1的数组。然后遍历arr,将arr[i]的值放进到help[arr[i] ]中,同时help的值加一。package Code01;public class Code06_BucketSort { public static void main(String[] args) { int[] arr = {2,7,9,1};原创 2020-05-12 09:38:37 · 454 阅读 · 0 评论 -
汉诺塔问题
解决汉诺塔问题可以使用递归的方法,将最底下的一根柱子看成一个整体,上面n-1根柱子看成是另外一个整体。然后一直递归到0.非递归版本貌似是用栈来完成,太菜了 目前还不会…然后就是给定一个数组判断它是最优解的第几步。首先我们先看数组的最后一个元素,它只能在from或者是to的位置,因为最开始的时候是将其单独看成一个整体的,目标就是将其移动到to的位置,因此是不可能出现在mid位置。同理前面的元素也是这样的,因此可以一直递归下去。package Demo01;public class Demo02_Ha原创 2020-05-08 20:33:07 · 113 阅读 · 0 评论 -
136.只出现一次的数字
给定一个非空整数数组,除了某个元素之出现一次以外,其余的每个元素都出现了两次。找出那个出现了一次的元素。思路:使用异或来进行操作。原创 2020-04-30 20:01:51 · 82 阅读 · 0 评论 -
Morris遍历
Morris遍历是一种时间复杂度为O(n),额外空间复杂度为O(1)的二叉树遍历方式。所利用的原理是将二叉树中一些空节点给利用起来,利用空的节点使得可以到达有左孩子的节点两次。实现思路:如果一个节点没有左孩子,那么该指针向右移动。如果一个节点有左孩子,那么找到左孩子中的最右节点,如果最右的节点为null,那么就最右的节点指向当前节点,然后当前的节点向左移动。如果最右的节点指向当前的节点,说...原创 2020-04-30 16:21:23 · 103 阅读 · 0 评论 -
马拉车夫算法
这个算法是求最长的回文字符串的在找之前需要将给定的字符串进行处理,在每个字符见加入#确保最后得到的字符串的长度是偶数。即使进行暴力运算也需要将字符串进行处理,不然偶数的字符串不好处理。package Code_01;public class Manacher { public static void main(String[] args) { String str...原创 2020-04-29 10:16:16 · 219 阅读 · 0 评论 -
KMP算法
KMP算法是求str2是否在str1中存在,然后返回在str1中出现的最早位置KMP算法中比较关键的一步是求next数组,即位置在i的字符,其前缀与后缀最大相等的个数package Code_01;public class KMP { public static void main(String[] args) { String s1 = "ABCDABDABCDA...原创 2020-04-29 08:58:34 · 136 阅读 · 0 评论 -
二叉树的序列化和反序列化
二叉树的序列化可以按照先序遍历的方式就行序列化,也可以按照层的方式就行序列化。package lianxi04;import java.util.LinkedList;import java.util.Queue;public class code04SerializeAndReconstructTree { public static void main(String[] a...原创 2020-04-11 23:13:22 · 83 阅读 · 0 评论 -
打印二叉树中的后继节点
后继节点:是指二叉树中序遍历的,node的下一个节点叫做后继节点。思路:因为是中序遍历后面的节点,所以如果一个节点有右孩子的话,那么后继节点一定是右孩子那颗子树上最左的节点。如果一个节点没有右孩子的话,先找到他的父节点,如果该节点是其其父节点的左孩子那么父节点就是后继节点,如果不是的话就继续往上找。package lianxi04;public class Code03_Successor...原创 2020-04-11 21:21:08 · 127 阅读 · 0 评论 -
判断两个单链表是否相交
思路:一个链表可能有环也有可能没环,我们要首先判断是否有环。如果两个都没有环,则用无环链表的方式进行判断;如果一个有环,一个没环,则肯定不存在相交的问题;两个都有环的话,采用有环的方式就行判断。无环的判断方式:先看一下两个链表的长度,然后让长链表先走n步,然后开始判断是否相等。有环的判断方式:先看一下环的起点是否一样,如果一样,则转化为无环的判断方式;若不一样则遍历其中一个环,看看是否能够遇到...原创 2020-04-07 11:15:54 · 213 阅读 · 0 评论 -
复制随机链表
含有随机链表的节点:链表中除了含有指向下一个节点的next,还有一个随机的节点rand。思路1:我们使用一个哈希表来进行存储数据。将链表中的节点与新创建的节点进行一一对应。这样我们在复制的时候就可以根据哈希表来进行操作。思路2:我们不适用额外的空间结构。我们将新创建的链表放在原有链表节点中的后面。然后在复制随机节点的时候,我们只需要找到当前节点的随机节点的后面那个节点就是我们要复制的随机节点...原创 2020-04-06 21:55:13 · 449 阅读 · 0 评论 -
如何之字形打印矩阵
给定一个矩阵matrix,按照“之”字形的方式打印这个矩阵。思路:我们可以一行一行的打印矩阵,只要设置好左下角和右上角的角标,然后在写一个方法来打印这一水平线上的各个元素。需要注意的是我们需要设置一个变量来保证是从上往下打印还是从下往上打印。package lianxi03;public class Code09_ZigZagPrintMatrix { public static ...原创 2020-04-06 09:57:38 · 384 阅读 · 1 评论 -
链表的反转
链表的反转我们要注意找好链表的前驱节点以及后续节点,然后将其进行就可以。对于双向链表来说,多了一个指向前面的指针,但是道理是一样的。package lianxi03;public class Code08_ListReverse { public static void main(String[] args) { Node head1 = new Node(1);...原创 2020-04-05 21:12:42 · 84 阅读 · 0 评论 -
转圈打印矩阵
给定一个整型的矩阵,按照转圈的方式打印。要求额外的空间复杂度为O(1)。思路:这个题我们可以进行一圈一圈的来进行打印。定义一个转圈打印的函数,每次将左上角和右下角的坐标给传递过去。这个题与旋转矩阵的思路是一样的,都是以圈为单位进行操作。只需要考虑每一圈怎么操作就好。package lianxi03;public class Code07_PrintMatrix { public s...原创 2020-04-05 20:04:18 · 166 阅读 · 0 评论 -
堆和栈的相互实现
堆实现栈:堆是一种先进先出的结构而栈是一种后进先出的结构,在构造的过程中使用两个堆。一个堆用来存放数据,另外一个堆在取出数据的时候用来存放数据。package lianxi03;import java.util.LinkedList;import java.util.Queue;public class Code04_QueueToStack { public static v...原创 2020-04-04 21:39:15 · 767 阅读 · 0 评论 -
特殊的栈
实现一个特殊的栈,在实现栈的基本功能上,实现返回栈中的最小元素的操作。思路:我们用两个栈,一个栈用来存放数据,另外一个栈(help)用来存放最小的元素。当我们新加进去的元素小于等于help栈中最上面的元素的时候,我们就将这个元素也放入到help栈中,当需要返回最小元素的时候就返回help栈中栈顶的元素。package lianxi03;import java.util.Stack;pu...原创 2020-04-04 17:10:23 · 143 阅读 · 0 评论 -
数组实现固定大小的堆和栈
数组实现栈:栈是一种后进先出的数据结构,用数组实现起来比较简单。package lianxi03;public class Code01_Array_Stcak { public static void main(String[] args) { ArrayStack s=new ArrayStack(2); s.add(1); s.a...原创 2020-04-04 16:08:53 · 290 阅读 · 0 评论 -
桶排序的运用
给定一个数组,求如果排序之后,相邻两数的最大差值,要求时间复杂度O(N),且要求不能用非基于比较的排序。思路:这种问题的就是要用到桶排序。先建立一个N+1的桶,再把数组中的数给放进去,这样就会保证有一个桶是空的,所以最大差值必然是不可能在桶内产生的。一定是中间有一个空桶或者两个相邻桶来产生的。package lianxi02;public class Code07_MaxGap { ...原创 2020-04-04 14:45:29 · 219 阅读 · 0 评论 -
桶排序
桶排序是一种非基于比较的排序,与被排序的样本有很大的关系。思路:先遍历数组将数组中最大的元素找出来max,然后创建一个新的数组,大小为max。在遍历数组,将大小为num的数字,放到num这个桶里面去,同时大小加一。package lianxi02;public class Code06_BucketSort { public static void main(String[] ar...原创 2020-04-04 13:56:50 · 111 阅读 · 0 评论 -
堆排序
堆排序:首先先建立一个大根堆,然后在进行排序。public class Code04_HeapSort { public static void main(String[] args) { int[] arr={2,6,8,1,3,0}; HeapSort(arr); PrintArray(arr); } public st...原创 2020-04-03 11:16:18 · 91 阅读 · 0 评论 -
快排
快速排序:原创 2020-04-03 09:49:09 · 102 阅读 · 0 评论 -
快排的引入
数组排序问题给定一个数组arr,和一个数num,请把小于等于num的数放在数组的左边,大于num的数放在数组的右边。思路:设置一个变量来记录位置,然后遍历数组,当数组中的值小于等于num的时候,就进行交换。public class Code01_Sort { public static void main(String[] args) { int[] arr={1,2...原创 2020-04-02 22:27:56 · 256 阅读 · 0 评论