
算法数据结构
文章平均质量分 64
酒醉梦醒
JAVA
展开
-
冒泡排序及其优化
冒泡核心思想:冒泡排序向右边冒泡的话,结果就是最后一个数就是最大的冒泡排序向左边冒泡的话,结果就是第一个数就是最小的这个好像不是冒泡吧。。。private static void maoPaoSort(int [] arr){ for(int i=0;i<arr.length;i++){ for(int j=i+1;j<arr.length;j++){ if(arr[i]>arr[j]){原创 2021-05-10 20:35:36 · 290 阅读 · 0 评论 -
数据结构-红黑树
数据结构-红黑树2-3树介绍2-3树红黑树性质2-3树插入红黑树性质fixUp代码参考2-3树介绍查阅很多博客好像都没有谈及红黑树的由来,包括著名的算法导论也只是先抛出5条红黑树的性质,在介绍红黑树之前不得不先介绍2-3树,左倾红黑树可以说等价于2-3树。2-3树一颗2-3树具有如下三个特性一个节点内部包含一个或两个关键码每个非叶子节点有两个孩子或者三个孩子(得名2-3树)所有叶子节点都在同一层除了这三个形状特性,还有一个如下特性,对于每一个节点,左子树所有节点值都小于第一个关键码,中间原创 2021-01-06 20:34:44 · 378 阅读 · 0 评论 -
数据结构-平衡二叉树
数据结构-平衡二叉树什么是平衡二叉树旋转RR型,左旋LL型,右旋LR型,先左旋再右旋RL型,先右旋再左旋源码AVLTreeAVLSetAVLMap什么是平衡二叉树阅读本篇博客前最好对二叉搜索树有一定了解。二叉搜索树二叉搜索树在最差的情况会退化成线性查找,所以才有了平衡二叉树。如下图所示:分别演示了平衡与不平衡的二叉树平衡二叉树每个节点都有一个平衡因子(图中红色数字),他的值为节点左子树树高-右子树树高平衡二叉树每个节点的左右孩子高度差<=1,平衡因子只能取-1,0,1三个值,否则就需要调原创 2021-01-05 19:05:40 · 580 阅读 · 0 评论 -
数据结构-二叉搜索树
数据结构-二叉搜索树结构作用实现结构作用如上图所示每个节点都大于左孩子,小于右孩子,以O(logn)复杂度进行如下操作插入一个元素查询是否包含某个元素删除某个元素插入元素7:从根节点出发,7>3,往右边走,7>5,往右边走,7>6&&6的右节点为空,把7插入到6的右孩子删除节点:如果删除的节点是根节点,注意修改root,叶子节点找到后直接删除,例如1,直接把2的左孩子置为null非叶子节点分为只含有左孩子的节点例如2,3.left=2.left即原创 2021-01-05 01:49:04 · 402 阅读 · 0 评论 -
数据结构-并查集
数据结构-并查集并查集是什么并查集的结构初始化合并查询并查集优化并查集实现并查集是什么并查集是一种用来管理元素分组的数据结构,可以高效进行合并查找操作查询元素a和元素b是否是同一分组合并元素a和元素b所在分组并查集的结构初始化准备n个节点表示n个元素,最开始每个节点都是单独的一个集合合并从一个组的根向另一个组的根连边查询为了查询两个节点是否属于同一组,我们需要沿着树网上找,来查询根是谁,如果两个节点根一样,则属于同一组元素1,2都网上找到根为3,属于同一组,元素4,6都找到原创 2021-01-04 21:40:21 · 389 阅读 · 1 评论 -
数据结构-字典树
数据结构-字典树什么是字典树源代码基于TreeMap的存储方案基于数组的存储方式部分算法解析match算法delete算法参考什么是字典树字典树又称Trie,单词查找树,典型用于统计,查找大量字符串,典型应用有通讯录,前缀搜索,搜索自动补全,打字补全等。如下图所示,树中存储单词cat,dog,deer, pan, pandaBST搜索树的时间复杂度为O(logn), trie的时间复杂度为O(w),w为单词长度源代码基于TreeMap的存储方案public class Trie {原创 2021-01-04 19:01:08 · 612 阅读 · 0 评论 -
数据结构-线段树
数据结构-线段树概述源代码概述线段树是一颗平衡的二叉搜索树,他以空间换区时间,让线性查找加速log级别的查找,用到的算法主要是二分搜索和递归。例如:有数组data[]={1,2,3,4}, 我有一个需求,我需要频繁的查找区间i~j的sum和。这里先给出两个解决方案:如果使用最普通的算法遍历,那么查找和更新的复杂度为O(n)。当然你还可以使用动态规划,定义dp数组为dp[i][j] ,意义为从i~j的sum和,但是更新某个数据的复杂度也是O(n)。又或者定义dp数组为dp[i], 意义为从0~i的原创 2020-12-30 11:32:31 · 318 阅读 · 0 评论 -
负载均衡算法
文章目录负载均衡算法加权随机算法算法解释code加权轮询算法算法解释code平滑加权随机算法算法解释code一致性hash算法算法解释code公共代码负载均衡算法加权随机算法算法解释codepublic class WeightRandom { public static Server getServer(){ int totalWeight = 0; ...原创 2020-03-06 17:57:28 · 481 阅读 · 0 评论 -
图论——二分图检测
文章目录图论——二分图检测问题分析代码图论——二分图检测问题分析什么是二分图,二分图的定义太过于晦涩,我们可以这么做,如果对于一张图,用黑白两个颜色给顶点染色,要求相邻顶点颜色不同,最终可以完成染色的图就是二分图。对于上图就是一张二分图,而我们如果加上0-3这条边就不是二分图,染色游戏好像高中组合问题学到过代码graph.txt7 60 10 21 32 62 31 4...原创 2020-01-18 15:08:38 · 878 阅读 · 0 评论 -
图论——环检测
文章目录图论——环检测问题分析代码图论——环检测问题分析检测上图是否有环其实也相当简单,只要dfs的过程发现某个顶点的邻接顶点已经访问过了,就说明有环,除此之外,还要排除一种情况,如下:例如从0开始dfs,0已访问dfs 1,发现1的邻接顶点0已被访问,此时不可以判定有环,即要排除已访问的顶点不是上一个顶点(parent)代码graph.txt7 60 10 21 32 ...原创 2020-01-18 14:53:35 · 1469 阅读 · 0 评论 -
图论——单源路径问题
文章目录图论——单源路径问题问题分析代码指定终点代码图论——单源路径问题问题分析对于本小节,我们只讨论简单无向无权图的单源路径问题。单源路径是指从某个给定顶点出发找到一条路径到其他顶点,其实在dfs或者bfs的过程中我们已经遍历了每个顶点,想求单源路径问题只不过要在遍历过程记录一些额外的信息,根据这些信息可以反推出路径。我们定义一个数组pre,pre存储的就是这些额外的信息pre[i...原创 2020-01-18 14:41:57 · 891 阅读 · 0 评论 -
图论——连通分量
文章目录图论——连通分量连通分量介绍DFS计算连通分量BFS计算连通分量图文件graph.txt建图类图论——连通分量连通分量介绍对于上图很显然连通分量为1,对于下图连通分量个数为2DFS计算连通分量通过上一小节dfs遍历的过程我们知道依次dfs就是一个连通分量,因为dfs只有走到无路可走才会回退,所以我们只需要记录一下dfs次数即可,有如下代码public class Undir...原创 2020-01-18 12:20:00 · 2907 阅读 · 0 评论 -
图论——遍历算法
文章目录图论——遍历算法DFS遍历BFS遍历图论——遍历算法DFS遍历深度优先搜索,以深度优先,直到走不下去,回退,对应的数据结构stack对于上图dfs的流程如下第一个节点0入栈,把0标记为已访问遍历0的所有邻接顶点,如果没有被访问就入栈,1入栈,1已访问遍历1的所有邻接顶点,如果没有被访问就入栈,3入栈,3已访问遍历3的所有邻接顶点,如果没有被访问就入栈,2入栈,2已访问遍...原创 2020-01-18 11:59:15 · 1395 阅读 · 0 评论 -
图论——邻接表HashSet,TreeSet存储
文章目录图论——邻接表HashSet,TreeSet存储前言HashSetTreeSet图论——邻接表HashSet,TreeSet存储前言上一小节已经说过邻接表了,用的是LinkedList数组存储,这一小节用另外两个数据结构。HashSet性能最高,但是集合中元素无序TreeSet性能略逊HashSet,基本无影响,集合中元素有序HashSetpublic class AdjHa...原创 2020-01-18 11:42:36 · 563 阅读 · 0 评论 -
图论——邻接表
文章目录图论——邻接表邻接表表示代码复杂度分析图论——邻接表邻接表表示对于上图的邻接表如下0:1->2 意思是顶点0保持着一个链表,链表里存放顶点0的邻接顶点1:0->3 意思是顶点1保持着一个链表,链表里存放顶点1的邻接顶点2:0->33:1->2代码public class AdjList { private int V;//顶点数 ...原创 2020-01-18 11:33:16 · 1250 阅读 · 0 评论 -
图论——邻接矩阵
文章目录图论——零阶矩阵声明图的邻接矩阵代码实现图论——零阶矩阵声明本小节针对的图是简单无向无权图,对于图的基本知识,例如什么是简单图,请自行百度。图的邻接矩阵对于上图的邻接矩阵A如下0 1 1 01 0 0 11 0 0 10 1 1 0矩阵A的A[0][1]=1代表从顶点0到顶点1有边代码实现public class AdjMatrix { private ...原创 2020-01-18 11:03:53 · 2159 阅读 · 0 评论 -
130. 被围绕的区域
文章目录130. 被围绕的区域问题描述问题分析代码130. 被围绕的区域问题描述给定一个二维的矩阵,包含 ‘X’ 和 ‘O’(字母 O)。找到所有被 ‘X’ 围绕的区域,并将这些区域里所有的 ‘O’ 用 ‘X’ 填充。示例:X X X XX O O XX X O XX O X X运行你的函数后,矩阵变为:X X X XX X X XX X X XX O X X解释:...原创 2020-01-16 18:13:47 · 340 阅读 · 0 评论 -
数字华容道——leetcode773
文章目录数字华容道——leetcode773问题描述分析代码数字华容道——leetcode773问题描述在一个 2 x 3 的板上(board)有 5 块砖瓦,用数字 1~5 来表示, 以及一块空缺用 0 来表示.一次移动定义为选择 0 与一个相邻的数字(上下左右)进行交换.最终当板 board 的结果是 [[1,2,3],[4,5,0]] 谜板被解开。给出一个谜板的初始状态,返回最少...原创 2020-01-15 17:12:03 · 2289 阅读 · 0 评论 -
智力题——5L的桶和3L的桶如何装4L的水
文章目录智力题——5L的桶和3L的桶如何装4L的水问题描述直观分析问题建模问题解决智力题——5L的桶和3L的桶如何装4L的水问题描述有一个5L的桶A和一个3L的桶B以及无限量的水,如何让5L的桶装4L的水。支持操作:加水,倒水,A倒入B,B倒入A,除此之外不再支持其他操作,例如做记号或者借助其他工具直观分析直观分析就是利用我们的直观思维在草纸上不停的模拟这些操作,这个很不好说,对于简单...原创 2020-01-15 12:14:51 · 3825 阅读 · 1 评论 -
floodfill问题——飞地的数量
文章目录floodfill问题——飞地的数量问题描述思路代码floodfill问题——飞地的数量问题描述给出一个二维数组 A,每个单元格为 0(代表海)或 1(代表陆地)。移动是指在陆地上从一个地方走到另一个地方(朝四个方向之一)或离开网格的边界。返回网格中无法在任意次数的移动中离开网格边界的陆地单元格的数量。示例 1:输入:[[0,0,0,0],[1,0,1,0],[0,1,1,0...原创 2020-01-15 10:41:58 · 418 阅读 · 0 评论 -
floodfill问题——岛屿的最大面积
文章目录floodfill问题——岛屿的最大面积问题描述思路代码扩展floodfill问题——岛屿的最大面积问题描述题目来自Leetcode695题给定一个包含了一些 0 和 1的非空二维数组 grid , 一个 岛屿 是由四个方向 (水平或垂直) 的 1 (代表土地) 构成的组合。你可以假设二维矩阵的四个边缘都被水包围着。找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为...原创 2020-01-15 10:23:38 · 429 阅读 · 0 评论 -
leetcode287寻找重复数
leetcode287寻找重复数给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。示例 1:输入: [1,3,4,2,2]输出: 2示例 2:输入: [3,1,3,4,2]输出: 3说明:不能更改原数组(假设数组是只读的)。只能使用额外的 O(1) 的空间。...原创 2019-10-17 11:13:41 · 401 阅读 · 0 评论 -
leetcode153寻找旋转排序数组中的最小值
leetcode153寻找旋转排序数组中的最小值假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。请找出其中最小的元素。可以假设数组中不存在重复元素。示例 1:输入: [3,4,5,1,2]输出: 1示例 2:输入: [4,5,6,7,0,1,2]输出: 0来源:力扣(LeetC...原创 2019-10-17 10:45:50 · 502 阅读 · 0 评论 -
leetcode80删除排序数组中的重复项 II
leetcode80删除排序数组中的重复项 II给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。示例 1:给定 nums = [1,1,1,2,2,3],函数应返回新长度 length = 5, 并且原数组的前五个元素被修改为 1, 1, 2, 2...原创 2019-10-17 10:32:40 · 345 阅读 · 0 评论 -
leetcode26删除排序数组的重复项
leetcode26删除排序数组的重复项给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。示例 1:给定数组 nums = [1,1,2],函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。你不需要考虑数组中超出新长度...原创 2019-10-17 10:25:05 · 340 阅读 · 0 评论 -
leetcode79单词搜索
leetcode79单词搜索给定一个二维网格和一个单词,找出该单词是否存在于网格中。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。示例:board =[[‘A’,‘B’,‘C’,‘E’],[‘S’,‘F’,‘C’,‘S’],[‘A’,‘D’,‘E’,‘E’]]给定 word = “A...原创 2019-10-14 18:02:16 · 457 阅读 · 0 评论 -
leetcode78子集
leetcode78子集题目:给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)输入:[1,2,3]输出:[[3],[1],[2],[1,2,3],[1,3],[2,3],[1,2],[]]解法:本题可以用很多方法做,动态规划,分治法,位算法等等,这里介绍一种位算法,很显然输出的元素个数是=1<<输入数组的长度例如示例,输出元素个...原创 2019-09-09 09:49:43 · 474 阅读 · 0 评论 -
深度优先DFS搜索算法
深度优先DFS搜索什么是深度优先搜索?深度优先搜索(DFS ,Depth-First Search)是搜索手段之一。它从某个状态,不断地转移状态直到无法转移,然后回退到前一步的状态,继续转移到其他状态,如此不断重复,直到找到最钟的解。原创 2017-05-26 19:48:30 · 1144 阅读 · 0 评论 -
leetcode39组合总数——递归回溯
题目:给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。说明:candidates 中的数字可以无限制重复被选取所有数字(包括 target)都是正整数解集不能包含重复的组合示例 :输入: candidates = [2,1,3], target = 3,所求解集为:[[2,1]...原创 2019-10-09 12:21:45 · 426 阅读 · 0 评论 -
leetcode120三角形最小路径和
题目给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。例如,给定三角形:[[2],[3,4],[6,5,7],[4,1,8,3]]自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/triangle题目分析贪心:失败(不...原创 2019-10-09 15:05:59 · 307 阅读 · 0 评论 -
leetcode31下一个排列
题目实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。必须原地修改,只允许使用额外常数空间。以下是一些例子,输入位于左侧列,其相应输出位于右侧列。1,2,5,4,3 →1,3,2,4,53,2,1 → 1,2,31,2,3 → 1,3,22,3,1 → 3,1,2来源:力扣(...原创 2019-10-09 16:09:40 · 336 阅读 · 0 评论 -
Leetcode跳跃游戏
文章目录Leetcode跳跃游戏题目简介跳跃游戏1跳跃游戏2Leetcode跳跃游戏题目简介给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个位置。 示例 1:输入: [2,3,1,1,4]输出: true解释: 从位置 0 到 1 跳 1 步, 然后跳 3 步到达最后一个位置。示例 2:输入: [...原创 2019-08-28 09:35:35 · 541 阅读 · 1 评论 -
leetcode64最小路径和
leetcode64最小路径和题目:给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。这道题是leetcode62的升级版,但是个人感觉难度差不太多,甚至这道题可能更简单一点,很显然的dp问题动态规划方程也很好找 grid[i][j]+=Math.min(grid[i-1][j],grid[i][j-1]);public int min...原创 2019-09-07 16:33:32 · 435 阅读 · 0 评论 -
leetcode56合并区间
leetcode56合并区间题目:给出一个区间的集合,请合并所有重叠的区间。示例 1:输入: [[1,3],[2,6],[8,10],[15,18]]输出: [[1,6],[8,10],[15,18]]解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].示例 2:输入: [[1,4],[4,5]]输出: [[1,5]]解释: 区间 [1,4] 和 [4,...原创 2019-09-07 16:08:48 · 393 阅读 · 0 评论 -
队列
文章目录队列队列知识初始化入队出队队列队列知识队列是一种先入先出的数据结构,和现实生活中的排队一样。队尾入队,队头出队。初始化接口public interface Queue<T> { //出队 T deque(); //入队 boolean enque(T t); //大小 int size();}public cl...原创 2019-07-15 17:02:03 · 260 阅读 · 0 评论 -
进制
文章目录二进制1的个数某个数是否是2的n次方(n>=0)需要改变多少位才可使两个数相等int,byte互转二进制1的个数解法一:右移整数 public static int num(int n){ int count=0; while(n>0){ if((n&1)!=0)++count; n&...原创 2019-07-12 17:51:24 · 310 阅读 · 0 评论 -
最大连续子数组的和
题目求一个数组的最大连续子数组和要求:时间复杂度o(n)思路例如 1,-2,3,-2,4,-2 最大子数组的和是5(3,-2,4)max保留曾经的最大连续子数组和,real保留真实相加的和int max=0,real=0;第一个数1max = 1,real=1第二个数-2max = 1,real=-1此时real= -1,可以抛弃1和-2了,重置real=0即 max = ...原创 2019-07-12 17:14:55 · 284 阅读 · 0 评论 -
找数字
题目:数组中某个数字出现次数超过数组大小一半,找出该数要求:满足题目要求,尽可能快,尽可能少用内存例如:1 2 1 3 11 出现了三次,应该输出1思路一利用快速排序一次划分算法,一次划分后中间的数即是所求。一次划分后 得 1 1 1 2 3中间的数是1 public static int partition(int[] arr,int i,int j){ whil...原创 2019-07-12 16:59:25 · 423 阅读 · 0 评论 -
动态规划之01背包问题(一)
背包问题动态规划之背包问题(一)问题介绍直观思维普通递归记忆搜索式递归穷竭搜索式递归如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入动态规划之背包问题(一)背包问题是动态规划最经典的问题之一...原创 2019-06-16 11:15:27 · 908 阅读 · 0 评论 -
红黑树
红黑树引子前几天看java TreeMap源码,发现TreeMap是有序的map集合,所以很感兴趣他是怎么实现的,原来是用了红黑树来实现。 相关知识介绍二叉排序树:中序遍历即得有序序列(大的放右边,小的放左边)Avl树/平衡二叉树:左右子树高度差不超过一的二叉排序树红黑树:不太严格的平衡二叉树(做了限制) 红黑树介绍红黑树(Red Black Tree) 是原创 2017-11-08 16:58:05 · 514 阅读 · 0 评论