每日一算法
高某某。。
这个作者很懒,什么都没留下…
展开
-
简答的树节点递归
给定一个节点,求出该节点内的最大距离:想法,最大距离可以根据下面三个计算 1.左子节点的最大距离 2.右子节点的最大距离 3.当前节点的最大距离private static class Node{ public Node left; public Node right; public Node(Node left,Node right){ this.left=left; this.right=right; } public Node(){ } } pr原创 2022-04-19 21:12:53 · 217 阅读 · 0 评论 -
Manacher求最长回文子串
按照原始的算法求最大回文字串,我们会将原始串左右两边比较 但是如果原始串的长度是偶数无法比较,比如 abba这里我们应该在哪里放中间点,所以一般会直接处理 处理为 #a#b#b#a#这样 防止出现偶数无法比较的情况,遍历每一个字符 然后左右比较最后得出最长回文字串。但是时间复杂度太高了,所以我们使用Manacher算法来帮助我们简化流程,首先我们需要了解几个概念,如图:我们为了得出最大回文半径,Manacher帮助我们如下优化:1.如果我们当前求的点在最右回文半径的外面,Manacher算法无法优化原创 2022-04-14 21:51:40 · 273 阅读 · 0 评论 -
KMP算法求子串的位置
首先我们给字符串规定一个东西,得出他们的结果数组 ,前缀和后缀 前缀就代表字符数组中前i个位置的字符,后缀就代表后i个位置的字符,数组的j位置就装,从j前一个字符开始的最大前缀和后缀相同的值,我们程该整型数组为nextArr:那么我们应该怎么获得这个字符串的字串的位置,两个字符串比较(s1是字符串的库,s2是想要求出现在哪个位置的字符串),如果出现了某个位置不相同的情况,我们就直接获取s2该位置的nextArr的值,查看它的最大相同前后缀的位置然后从前缀的后面一个位置开始继续和我们该位置的比较,如果再不同原创 2022-04-12 22:03:13 · 637 阅读 · 0 评论 -
并查集问题
这道题非常简单,直接双重for循环遍历每一个节点 查看是否是1,如果是就把改位置以及和他相邻位置的为1的节点设置为2,然后岛的数量+1即可,代码如下:public static void main(String[] args){ int arr[][]={{0,1,0,1,0,1}, {1,1,1,1,0,1}, {1,0,0,0,1,1}, {0,0,1,0,0,0}}; System.out.println(process1(arr)); } public sta.原创 2022-04-11 21:30:43 · 206 阅读 · 0 评论 -
贪心算法的简单问题
活动选择问题 老经典了 算法书上必有的算法 根据结束时间早的排序来选:public static class Program{//活动对象 public int start; public int end; public Program(int start,int end){ this.start=start; this.end=end; } } public static class ProgramCompare implements Comparator<.原创 2022-03-29 21:44:17 · 448 阅读 · 0 评论 -
图的一些简单算法
图的结构://图 public class Graph { public HashMap<Integer,Node> nodes; public HashSet<Edge> edges; public Graph() { this.nodes = new HashMap(); this.edges = new HashSet(); } }=============================================================原创 2022-03-24 21:56:56 · 218 阅读 · 0 评论 -
树的一些简单算法
检查一颗树是否是搜索二叉树 当一个节点比它的左子树所有值大,比它的右子树的所有节点值小那么它就是搜索二叉树。用递归算法即可 我们根据左中右的顺序 可以知道最好使用中序遍历,先看左数是不是,如果不是直接返回false,此时我们需要比较左树的值和当前值比较如果比当前值小那么符合。同时赋值给preValue,给右子树使用。 我们细化到左子树里面其实我们知道,最后一个给preValue赋值的是最右边的的节点,这个节点一定是整棵树最大的值,细化到右边也同理。//检查一棵树是否是搜索二叉树 任意一个节点肯定.原创 2022-03-21 21:49:44 · 577 阅读 · 0 评论 -
树的一些简单操作
1.树的宽度优先遍历:这个没什么好说的,直接用队列即可public static void widthFirst(Node node){//使用队列即可完成宽度优先遍历 Queue<Node> queue=new LinkedList<>(); queue.add(node); while(!queue.isEmpty()){ Node temp=queue.poll(); System.out.println(temp.val); if(temp.原创 2022-03-18 21:26:06 · 237 阅读 · 0 评论 -
树的先种中序后序遍历
树节点://树的节点public class Node<T> { T val; public Node(T val){ this.val=val; } Node left; Node right;}先序遍历: //先序遍历 头左右 public static void firstOrder(Node node){ if(node==null) return; System.out.println(node.val);//先打印头节点 再左 最后右边原创 2022-03-17 21:19:43 · 230 阅读 · 0 评论 -
链表的相交问题
问题:给定两个单链表,不能确定有环还是无环,判断他们是否相交,返回相交的节点时间复杂度O(n)空间O(1)。首先我们需要去判断这个单链表是无环还是有环,用一个双指针,一个走一步一个走两步,如果有环的话那么他们最终一定会相交,当遇到指向null的情况那么就表明他们无环。如何返回入环的第一个节点喃,这里有一个数学上的东西,我不会证明大家记住就好,在相遇后让快指针指向头节点当他们,都一步一步的走,当他们相等时,这两个指针指向的就是入环的第一个节点。代码如下://判断一个链表是否是环 同时返回他们的入环节点原创 2022-03-16 21:42:30 · 811 阅读 · 0 评论 -
链表的相关操作
一个链表的数据结构如下public class ListNode { public int val; public ListNode next=null; public ListNode rand=null; ListNode(int val){ //构造方法 :构造方法和类名相同 this.val=val; //把接收的参数赋值给当前类的val变量 }}问题:如果一个链表的next节点指向它的下一个节点,它的rand节点指向随机节点(可以为null)原创 2022-03-14 20:02:15 · 1019 阅读 · 0 评论 -
springboot的自动装配流程
相信大家在看springboot框架源码的时候一定已经看过spring的源码了吧 ,所以对于一些普通的操作我就不做解释了。直接开始正题:首先是应用程序上下文的创建,我们知道在spring中我们一般使用自己创建的xmlApplicationContext,在spring中他会根据不同的情况来创建不同的上下文类型,但是一般我们不特别配置都是servlet环境对应的上下文对象下一步实例化操作,我记得在mybatis中也有过调用构造方法创建的的对象的过程,等一下们去看一下再贴出来。观察beanDefin原创 2022-03-13 09:58:46 · 1499 阅读 · 0 评论 -
基数排序算法
我们获取到最大的数的位数遍历每个数的某一位的(个位或者十位等)位数,将该位数的数字放入一个数组计数器中,计算该数出现了多少次,每个位置上的数字就代表了该数字出现了几次,比如2位置上的数为1,代表2出现了依次,然后求该数组的前缀和,前缀和就是i位置上的数是前面所有位置上的数的和加上自己位置上的数,举个例子,如图:在求完前缀和过后,我们数组中的数就变成了小于等于i的数出现了几次。将我们的数放入帮助数组之中,放在哪个位置,首先倒着遍历原来的数组,为什么要倒着,等一下解释,先看如何放,每当遍历到一个数过后.原创 2022-03-09 22:24:06 · 139 阅读 · 1 评论 -
堆排序算法
首先我们需要了解大根堆的概念,如果一个数 他的左右子节点的值都比他小,那么就可以称作大根堆1.我们需要知道如何生成大根堆,遍历一个数组中所有的数,每个数都与它的父节点比较如果大于父节点,那么就和父节点更换再数组中的位置,直到它比父节点小或者没有父节点的时候结束,下面是代码: public static void heapInsert(int arr[],int index){ while(arr[index]>arr[(index-1)/2]){ swap(arr,index,(inde原创 2022-03-08 21:34:50 · 131 阅读 · 1 评论 -
归并排序算法
//归并排序 思想就是分成左右两边 分别排序 排好序过后进行一个归并过程 时间复杂度O(n*logn) public static void mergeSort(int arr[],int left,int right){ if(left==right){ return; } int mid=left+((right-left)>>1); mergeSort(arr,left,mid); mergeSort(arr,mid+1,right); Merge(ar原创 2022-03-06 21:38:27 · 170 阅读 · 1 评论 -
位运算的问题
//基础知识异或 就是将某一个数的二进制位进行运算相同位0 不同为1 a^a=0 a^0=a//问题1:如果一个数组中有一个数出现奇数次,其他数出现偶数次,请找出这个数//问题2:如果一个数组中有两个数出现奇数次,其他数出现偶数次,请找出这两个数 时间复杂度为O(n)public class Test01 { public static void compute1(int arr[]){ //如果只有一个数出现奇数次,那么我们直接对数组遍历进行位运算,出现偶数次的数直接为0,结果就是出现奇原创 2022-03-05 21:36:12 · 72 阅读 · 0 评论 -
二分法的几个问题
1.二分查找:就是一次二分即可//二分法 public static int BisectionMethod(int arr[],int a){ int left=0,right=arr.length-1; while(left<=right){ int mid=(left+right)/2;//取中间值 if(arr[mid]==a){ return mid; }else if(arr[mid]>a){ right=mid-1; }else原创 2022-03-05 21:28:04 · 109 阅读 · 0 评论 -
每日一算法
给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。示例 2:输入:height = [1,1]输出:1示例 3:输入:height = [4,3,2,1,4]输出:16示例 4:输入:height = [1,2,1]输出:2解:这道题我是看来解法过后做的,我来为大家解释一下为什么使用原创 2021-12-18 16:25:15 · 193 阅读 · 0 评论 -
每日一算法
初始时有 n 个灯泡处于关闭状态。第一轮,你将会打开所有灯泡。接下来的第二轮,你将会每两个灯泡关闭第二个。第三轮,你每三个灯泡就切换第三个灯泡的开关(即,打开变关闭,关闭变打开)。第 i 轮,你每 i 个灯泡就切换第 i 个灯泡的开关。直到第 n 轮,你只需要切换最后一个灯泡的开关。找出并返回 n 轮后有多少个亮着的灯泡。示例 2:输入:n = 0输出:0示例 3:输入:n = 1输出:1解:我第一次就是想的这道题很简单直接一个双重for循环一个数组模拟就行了,于是我这样做了c原创 2021-12-16 19:22:48 · 91 阅读 · 0 评论 -
每日一算法
给定一个包含 [0, n] 中 n 个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数。示例 1:输入:nums = [3,0,1]输出:2解释:n = 3,因为有 3 个数字,所以所有的数字都在范围 [0,3] 内。2 是丢失的数字,因为它没有出现在 nums 中。示例 2:输入:nums = [0,1]输出:2解释:n = 2,因为有 2 个数字,所以所有的数字都在范围 [0,2] 内。2 是丢失的数字,因为它没有出现在 nums 中。示例 3:输入:原创 2021-12-15 15:53:44 · 648 阅读 · 0 评论 -
每日一算法
Alice 有 n 枚糖,其中第 i 枚糖的类型为 candyType[i] 。Alice 注意到她的体重正在增长,所以前去拜访了一位医生。医生建议 Alice 要少摄入糖分,只吃掉她所有糖的 n / 2 即可(n 是一个偶数)。Alice 非常喜欢这些糖,她想要在遵循医生建议的情况下,尽可能吃到最多不同种类的糖。给你一个长度为 n 的整数数组 candyType ,返回: Alice 在仅吃掉 n / 2 枚糖的情况下,可以吃到糖的最多种类数。示例 1:输入:candyType = [1,1,2,原创 2021-12-15 15:39:39 · 114 阅读 · 0 评论 -
每日一算法
给你一座由 n x n 个街区组成的城市,每个街区都包含一座立方体建筑。给你一个下标从 0 开始的 n x n 整数矩阵 grid ,其中 grid[r][c] 表示坐落于 r 行 c 列的建筑物的 高度 。城市的 天际线 是从远处观察城市时,所有建筑物形成的外部轮廓。从东、南、西、北四个主要方向观测到的 天际线 可能不同。我们被允许为 任意数量的建筑物 的高度增加 任意增量(不同建筑物的增量可能不同) 。 高度为 0 的建筑物的高度也可以增加。然而,增加的建筑物高度 不能影响 从任何主要方向观察城市得原创 2021-12-13 15:56:03 · 4198 阅读 · 0 评论 -
每日一算法
给你一个字符串 licensePlate 和一个字符串数组 words ,请你找出并返回 words 中的 最短补全词 。补全词 是一个包含 licensePlate 中所有的字母的单词。在所有补全词中,最短的那个就是 最短补全词 。在匹配 licensePlate 中的字母时:忽略 licensePlate 中的 数字和空格 。不区分大小写。如果某个字母在 licensePlate 中出现不止一次,那么该字母在补全词中的出现次数应当一致或者更多。例如:licensePlate = “aBc 1原创 2021-12-11 10:32:47 · 83 阅读 · 0 评论 -
每日一算法
给你一个字符串数组 board 表示井字游戏的棋盘。当且仅当在井字游戏过程中,棋盘有可能达到 board 所显示的状态时,才返回 true 。井字游戏的棋盘是一个 3 x 3 数组,由字符 ’ ',‘X’ 和 ‘O’ 组成。字符 ’ ’ 代表一个空位。以下是井字游戏的规则:玩家轮流将字符放入空位(’ ')中。玩家 1 总是放字符 ‘X’ ,而玩家 2 总是放字符 ‘O’ 。‘X’ 和 ‘O’ 只允许放置在空位中,不允许对已放有字符的位置进行填充。当有 3 个相同(且非空)的字符填充任何行、列或对原创 2021-12-09 19:30:00 · 107 阅读 · 0 评论 -
每日一算法
给你一个整数 n ,请你在无限的整数序列 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, …] 中找出并返回第 n 位上的数字。示例 1:输入:n = 3输出:3示例 2:输入:n = 11输出:0解释:第 11 位数字在序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ... 里是 0 ,它是 10 的一部分。这道题的意思就是在一个数组里面 数字按1,2.。。排列的 我们要把里面的每个数字都当作是一位比如100它就包含了3位 1 0原创 2021-12-08 16:45:08 · 184 阅读 · 0 评论 -
每日一算法
句子 是一个单词列表,列表中的单词之间用单个空格隔开,且不存在前导或尾随空格。每个单词仅由大小写英文字母组成(不含标点符号)。例如,“Hello World”、“HELLO” 和 “hello world hello world” 都是句子。给你一个句子 s 和一个整数 k ,请你将 s 截断 ,使截断后的句子仅含 前 k 个单词。返回 截断 s 后得到的句子。示例 1:输入:s = "Hello how are you Contestan原创 2021-12-08 16:32:15 · 73 阅读 · 0 评论 -
每日一算法
为了不在赎金信中暴露字迹,从杂志上搜索各个需要的字母,组成单词来表达意思。给你一个赎金信 (ransomNote) 字符串和一个杂志(magazine)字符串,判断 ransomNote 能不能由 magazines 里面的字符构成。如果可以构成,返回 true ;否则返回 false 。magazine 中的每个字符只能在 ransomNote 中使用一次。示例 1:输入:ransomNote = "a", magazine = "b"输出:false示例 2:输入:ransomNote原创 2021-12-08 16:28:42 · 79 阅读 · 0 评论 -
每日一算法
给你一个字符串 s ,字符串的「能量」定义为:只包含一种字符的最长非空子字符串的长度。请你返回字符串的能量。示例 1:输入:s = "leetcode"输出:2解释:子字符串 "ee" 长度为 2 ,只包含字符 'e' 。示例 2:输入:s = "abbcccddddeeeeedcba"输出:5解释:子字符串 "eeeee" 长度为 5 ,只包含字符 'e' 。示例 3:输入:s = "triplepillooooow"输出:5示例 4:输入:s = "hooraaaaaa原创 2021-12-08 16:23:38 · 75 阅读 · 0 评论