![](https://img-blog.csdnimg.cn/8caed37d74d443a997e531e113599216.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构和算法入门
刷题前的准备
亿咕
Life is a trade-off
展开
-
求两个数的最大公约数【辗转相除法|欧几里得算法】
public int gcd(int m,int n){ return n==0 ? m:gcd(n,m%n);}m = qn + r,q为m除以n的商,r为m除以n的余数,则有,m和n的最大公约数为n和r的公约数。原创 2022-02-05 08:55:40 · 254 阅读 · 0 评论 -
【Kruskal算法】:)
适用范围:要求无向图1:用于生成“最小生成树”,2:最小生成树:保证点是连通的,整体的总权值是最小的算法描述:以边的角度出发,以次找出最小的边,排序好所有的边,以此拿着它,看它是否构成环,若不构成环则加入答案边集元素包装成集合public static class MySets{ public HashMap<Node,List<Node>> setMap;//一个注册表,每个节点对应一个集合 public MySets(List<Node> node.原创 2021-08-20 18:34:06 · 72 阅读 · 0 评论 -
【拓扑排序算法】+ 辅助记忆
适用范围:1.要求有向图2.有入度为0的节点(用来做起点)3.没有环常用于加载库和编译顺序辅助记忆两个空间,做记录找点,拿点试探public staic List<Node> sortedToPology(Graph graph){//传入图 HashMap<Node,Integer> inMap = new HashMap<>();//待定空间,某个点和对应的入度 Queue<Node> zeroInQueue = new Like.原创 2021-08-20 16:56:03 · 65 阅读 · 0 评论 -
【图】+【宽度】+【深度】+ 辅助记忆
图的最常用的存储方式1):邻接表法2):邻接矩阵法某些特殊情况3):数组1:其实无向图,不过就是一种拥有两个方向的有向图2:这构建图这种数据结构时,靠的是两个集合,“点集”和“边集”3:设计图的题都不是很难,但是他们的表达方法太多,写法是不同的,但是算法是一样的;也正因为如此,我们应该准备一个通用的熟悉模板,遇到特殊情形的转化成匹配模板的那种,且该模板需要表达所有的方法何谓邻接表法(表)以每一个点为单位,描述每一个点他们对应邻接着哪些点,即以点为单位(如果为有权图,则每一个对应的邻接.原创 2021-08-20 16:15:10 · 64 阅读 · 0 评论 -
经典岛问题
问题描述:> 一个矩阵中只有0和1两种值,每一个位置都可以和自己的上下左右四个方向相连,如果有一片1连在一起,这个部分叫做岛,求一个矩阵有多少个岛?代码实现:public static int countIslands(int [][]m){ if(m==null||m[0]==null){ return 0; } int N = m.length;//行 int M = m[0].length;//列 int res = 0; for(int i = 0;i < N;.原创 2021-08-19 07:54:16 · 81 阅读 · 0 评论 -
一大【堆】
1.堆结构就是用数组实现的完全二叉树结构2.完全二叉树中如果每一颗子树的最小值/最大值在顶根处就是小根堆/大根堆3.堆的两个核心操作heapInsert和heapify4.优先队列结构,就是堆结构用数组形成的堆,利用索引完成比较实现根堆索引和节点的关系:当前索引: i左子节点:2 * i + 1右子节点:2 * i + 2父节点:(i - 1) / 2核心操作heapInsert和heapify的实现//以大根堆为例public static void heapInsert(in原创 2021-08-15 10:06:17 · 75 阅读 · 0 评论 -
Java如何实现【归并排序】?
盖言之: 整体就是一个简单递归,左边排序好,右边排序好,让其整体有序,让其整体有序是用外排序特点: 一种较快稳定的排序时间复杂度: O(N*logN),可用master公式计算空间复杂度: O(N),因为会用到一个help辅助空间稳定性: 稳定重要性: 很重要,必掌握编写难度: medium其他:归并排序快的原因:并没有浪费比较行为稳定性的原因:左区域优先(详情见注释)代码示梨:(注释有宝贝)public static void mergeSort(int []arr){原创 2021-08-12 11:33:59 · 73 阅读 · 0 评论 -
怎么用【master公式】求【递归行为的复杂度】?
前言master公式(又名“主方法”)是利用分治策略求解特定类型的递归的复杂度的一种技巧性方法,掌握它对于分析递归行为的复杂度很有帮助使用前提: 每一次递归划分的数据规模是否一样?公式的使用:每一次递归划分的数据规模相同有:T(N) = aT(N/b) + O(N^d)那么有:1:若log(b,a) > d,则复杂度为O(N^log(b,a))1:若log(b,a) = d,则复杂度为O(N^dlogN)1:若log(b,a) < d,则复杂度为O(N^d)书写版:原创 2021-08-12 10:25:01 · 235 阅读 · 0 评论 -
超好用的【对数器】怎么用?
对数器:核心思想:用一堆随机数测试,用绝对对的方法来验证你的方法作用:帮你测试代码是否实现成功不用再依赖OJ平台辛辛苦苦找题如何使用:1:写好你要测试的方法a 2:准备一个任意实现的方法b3:实现一个随机样本产生器4:随机样本都拿到方法中运行,匹配两者是否一致5:如果不一致,则打印样本进行人工干预改进方法a或方法b;6:当样本数量很多时比对测试依然正确,可以确定方法a正确补充知识:1:关于随机数Math.random();//[0,1)所有小数Math.random()原创 2021-08-12 09:29:31 · 99 阅读 · 0 评论 -
Java如何实现【打牌插入排序】?
插入排序(打牌排序):时间复杂度:O(N^2)空间复杂度:O(1)稳定性:稳定编写难度:easy辅助理解:想象出打牌,从左往右拿待比较牌,从右往左拿比较牌//升序public static void insertionSort(int []arr){ if(arr==null||arr.length<2){return ;} for(int i = 0;i<arr.length-1;i++){//从左往右拿牌,且 for(int j = i-1;j>=0&原创 2021-08-11 10:21:59 · 67 阅读 · 0 评论 -
利用【异或运算】技巧求解“奇偶次数题”
问题一:一个数组中有一种数,出现奇数次,其他的数全出现偶数次,问:如何找到这个与众不同的奇数次的数?解:其实利用异或运算是很容易求解的,由N^N = 0,可知“任意数和本身异或之后为0”,既然出现的是偶数次,那么那些出现偶数次的数可以拆为一对一对的,每一对相互异或就为0,最终可知:“把所有偶数次的数相互异或后为0”最后就剩下奇数次的数,而N^0 = N,即,任何一个数和0异或为本身,留下的奇数词的数和0异或之后还是自己。数学举例:数组:arr{1,1,1,2,2,3,3,3,3}1,1,1可看原创 2021-08-11 09:58:41 · 733 阅读 · 0 评论 -
Java如何实现【冒泡排序】?
冒泡排序:最基本的一种排序`时间复杂度:O(N^2)空间复杂度:O(1)编写难度:easy辅助理解:想象出一个天平public class BubbleSort(int []arr){ if(arr==null||arr.length < 2){ return ; } //第一种实现方法 for(int i = arr.length-1;i > 0;i--){// for(int j = 0;j<i;j++}{ if(arr[i]>arr[i+1]){原创 2021-08-11 08:48:15 · 70 阅读 · 0 评论 -
交换的进阶技巧(不使用第三变量)
技巧如下:a = a^b;b = a^b;a = a^b;功能:交换数据;优点:不加入第三变量,节省空间,简化代码,有b格;缺点:得考虑数据之间独立情况(大部分能用,毕竟变量之间不独立的特殊情况很少)前提:带交换的两个变量是独立的,假如有,相同异或之后归零导致错误,交换失败;补充:1:异或运算:本质上是“无进位相加”;口诀/结论:相同为0(xx^xx==0;)与0为己(xx^0 ==xx;)案例:...原创 2021-08-09 22:45:08 · 67 阅读 · 0 评论 -
Java如何实现前缀树(对于存少量字符,如:小写字母字符)
实现难度:easy建议:抄一遍,过程中注意我写的注释实现算法模板class Trie{//内部类一个节点类 class TrieNode{ TrieNode[] nexts = new TrieNode[26]; boolean last; int pass = 0;//用来记录通过节点的次数 int end = 0;//用来标记作为结尾节点的次数 } TrieNode root;//创建一个根节点原创 2021-08-08 22:31:06 · 87 阅读 · 0 评论