算法
算法
~~^^
这个作者很懒,什么都没留下…
展开
-
【数据结构】B树(B Tree)
一、定义B树是一个平衡的多路搜索树,每个节点可以存储多个元素。二、性质对于m阶B树(m>2),设其任意节点存储元素的个数为x,那么:对于根节点:1 <= x <= m-1对于非根节点:ceil(m/2) - 1 <= x <= m-1如果有子节点,子节点个数为 y = x+1,根节点子节点个数:2 <= y <= m非根节点子...原创 2020-02-28 12:24:52 · 979 阅读 · 0 评论 -
【数据结构】红黑树(Red Black Tree)
前言以前在了解HashMap时得知JDK8的HashMap是用红黑树实现的,而且网上还流传着手写红黑树的梗,数据结构课上也没交过这个,于是就学学吧。一、为什么要用红黑树因为相较于普通的二叉搜索树,红黑树具有平衡性。这与AVL树相似,在增加或删除元素后可能会出现旋转的操作。但是相较于AVL树严格的约束(左右子树的高度之差的绝对值最多为1),红黑树的平衡约束更为宽松,其旋转操作的时间复杂度为O...原创 2020-02-28 20:22:16 · 521 阅读 · 0 评论 -
【算法】最长公共子序列
题目举例解答设长度为N的字符串str1、长度为N的字符串str2设矩阵dp[N][M]dp[0][j] (j∈[0,M])是矩阵第一行,比如例子中的str1[0]=‘1’,拿其去和str2的每一项去匹配,当匹配到str2[1]时有str1[0] == str2[1],而此时将dp[0][1]标为1,dp[0][1…M]都标为1dp[i][0] (i∈[0,N])是矩阵第一列,同步...原创 2020-02-21 22:23:37 · 216 阅读 · 0 评论 -
【算法】换钱1
题目举例解答假设arr=[5,2,3],aim=15数组arr长度N设数组dp[N][aim]dp[i][0] (i∈[0,N])为数组第一列,表示使用arr[i]的货币换的钱数0时,需要的钱的张数,全部标为0。dp[0][j] (j∈[0,aim])为数组第一行,表示使用arr[0]的货币换钱数j时,需要的钱的张数。arr[0]=5,aim=15,则dp[0][5]=1,dp...原创 2020-02-21 16:57:27 · 269 阅读 · 0 评论 -
【算法】矩阵的最小路径和
题目给定一个矩阵,从矩阵左上角开始走到右下角,每次只能向下或向右,将路径上的数字求和,求所有路径中路径和最小的。举例给定矩阵:最短路径如下:解答1.假设现在给定1*4的矩阵R:设当前元素距离左上角的距离为dp[0][i],那么矩阵R的dp[0]如下:则最小路径和为182.假设现在给定4*1的矩阵C:设当前元素距离左上角的距离为dp[i][0],那么矩阵R的dp[i][...原创 2020-02-21 14:27:22 · 1400 阅读 · 0 评论 -
【算法】摩尔投票法
在LeetCode上刷题,碰见了一个简单的题:给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在众数。示例 1:输入: [3,2,3]输出: 3示例 2:输入: [2,2,1,1,1,2,2]输出: 2首先想到的做法是做类似桶排序那样,开辟一个数组统计各个数字出现的次数。但是这...原创 2019-10-21 17:23:26 · 226 阅读 · 0 评论 -
【算法】并查集
class UnionFind { Integer[] arr; public UnionFind(int size) { this.arr = new Integer[size]; for (int i = 1; i < arr.length; i++) arr[i] = new Integer(i); } ...原创 2018-11-20 21:48:30 · 138 阅读 · 0 评论 -
【数据结构】完全二叉树判定
pta题号 L3-010判断一棵树是否是完全二叉树的思路1&gt;如果树为空,则直接返回错 2&gt;如果树不为空:层序遍历二叉树 2.1&gt;如果一个结点左右孩子都不为空,则pop该节点,将其左右孩子入队列; 2.1&gt;如果遇到一个结点,左孩子为空,右孩子不为空,则该树一定不是完全二叉树; 2.2&gt;如果遇到一个结点,左孩子不为空,右孩子为空;或者左右孩子都为空;则...原创 2019-02-27 21:23:04 · 668 阅读 · 0 评论 -
【数据结构】图 Dijkstra算法 最短路 Java实现
import java.util.*;public class Main { public static void main(String[] args){ //起点 String start = "A"; //建立图 HashMap&lt;String, List&lt;Node&gt;&gt; map = new ...原创 2019-03-06 19:59:35 · 402 阅读 · 1 评论 -
【动态规划】最长公共子序列问题 LCS
状态转移方程if(两个字符相等)dp[i][j] = dp[i-1][j-1]+1;elsedp[i][j] = Math.max(dp[i-1][j],dp[i][j-1]);注意越界用例:123123456123333456代码import java.util.Scanner;public class Main { static Scanner in =...原创 2019-03-20 17:16:38 · 191 阅读 · 0 评论 -
【数据结构】图的连通分量
什么是连通分量如图,在上面的图中有12个点,他们连接构成了三个部分。{0,1,2,6,3,4,5},{7,8},{9,10,11,12}这三个部分就是这个图的连通分量。如何计算联通分量使用dfs可以遍历一个点所在连通分量中所有的点。在每次遍历时,我们可以对一个连通分量中的点进行标记、染色。例如:首先,声明一个变量count用于统计,以及标记数组color[]。然后,从0开始遍历,我们会...原创 2019-03-29 17:00:57 · 24916 阅读 · 1 评论 -
【数据结构】图 最小生成树 Prim算法
什么是最小生成树举个栗子:假如有一些点,它们通过边相互连接,每条边都带有权值。现在让你从这些边中选出一种方案,保证能使所有点在一棵树上且所有边的权值和在所有可行方案中最小。Prim算法如何找到最小生成树首先将图中所有的边添加到优先队列中,按升序排列。然后权值最小的边出队,将该边的两端的点那数组标记下来。注意当取出边的两端点都层被标记过,该边作废。最后可以没有作废的边,生成最小生成树。代码...原创 2019-03-29 21:55:02 · 943 阅读 · 0 评论 -
【数据结构】二分图
二分图只使用两种颜色,将图的顶点染色,如果能保证每个相连的顶点颜色不同的话,这个图则是二分图。二分图的判断import java.util.Scanner;public class Main { static Scanner in = new Scanner(System.in); static int V = 3;//顶点数 static int[] co...原创 2019-03-26 23:13:59 · 1258 阅读 · 0 评论 -
【数据结构】二分图 匹配 匈牙利算法
简介回头补上题目 HDOJ 2063 :: 过山车代码import java.util.*;public class Main { public static int map[][]=new int [1010][1010];//男生和女的有关系数 public static int match[]=new int[1010]; //匹配人的编号;0...原创 2019-03-28 23:26:05 · 160 阅读 · 0 评论 -
【数据结构】图 最小生成树 克鲁斯卡尔 kruskal
找最小边,合并边为了避免形成环,使用并查集来记录连通分量#include <iostream>#include <bits/stl_algo.h>using namespace std;int n, m;int u[100], v[100], w[100], p[100], r[100];int cmp(const int i, const int j) ...原创 2019-06-17 10:42:08 · 184 阅读 · 0 评论 -
【洛谷】P1551 亲戚 并查集
链接:https://www.luogu.org/problemnew/show/P1551import java.util.Scanner;public class Main{ public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = i...原创 2018-11-20 21:45:28 · 260 阅读 · 0 评论 -
【蓝桥杯】合根植物 并查集
问题描述 w星球的一个种植园,被分成 m * n 个小格子(东西方向m行,南北方向n列)。每个格子里种了一株合根植物。 这种植物有个特点,它的根可能会沿着南北或东西方向伸展,从而与另一个格子的植物合成为一体。如果我们告诉你哪些小格子间出现了连根现象,你能说出这个园中一共有多少株合根植物吗?输入格式 第一行,两个整数m,n,用空格分开,表示格子的行数、列数(1&lt;m,n&lt;1...原创 2018-11-20 21:14:23 · 397 阅读 · 0 评论 -
【蓝桥杯】2018.B组.Java.第三题
复数幂设i为虚数单位。对于任意正整数n,(2+3i)^n 的实部和虚部都是整数。求 (2+3i)^123456 等于多少? 即(2+3i)的123456次幂,这个数字很大,要求精确表示。答案写成 “实部±虚部i” 的形式,实部和虚部都是整数(不能用科学计数法表示),中间任何地方都不加空格,实部为正时前面不加正号。(2+3i)^2 写成: -5+12i,(2+3i)^5 的写成: 122-5...原创 2018-11-08 19:59:14 · 627 阅读 · 3 评论 -
【算法】快速幂/快速幂取余(演算过程/代码)
快速幂快速幂算法例子:$$5^{16}=25^8=625^4=390625^2=152 587 890 625$$$$3^{20}=9^{10}=81^5=81*81^4=81*6561^2=81*43046721=3486784401$$利用二分法能大大加快了求解速度代码:int Power(int base,int index){ int result...原创 2018-02-16 22:46:53 · 298 阅读 · 0 评论 -
【算法】回文串&镜像串
回文串&镜像串字符对应关系A 3 HIL JM O 2TUVWXY51SE Z 8 (镜像字符)ABCDEFGHIGKLMNOPQRSTUVWXYZ123456789(原字符)镜像字符为空的地方,说明对应的原字符没有镜像字符ABCDEFGHIGKLMNOPQRSTUVWXYZ123456789(原字符)镜像字符为空的地方,说明对应的原字符没有镜像字符样例...原创 2018-04-25 21:41:56 · 450 阅读 · 0 评论 -
【算法】快速排序
算法介绍快速排序快速排序(Quicksort)是对冒泡排序的一种改进。快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。详解对于一个长度大于1的数组arr,...原创 2018-08-27 13:54:49 · 145 阅读 · 0 评论 -
【算法】DFS入门
找子集 List<Integer> temp = new ArrayList<>(); //子集 List<List<Integer>> arr = new ArrayList<>(); //存放子集 public void dfs(Integer[] num, int n){ ...原创 2018-08-27 15:45:58 · 334 阅读 · 0 评论 -
【算法】康托展开
康托展开公式 X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0!解释公式的实质是将一个数列转换为一个数字;而这个数字恰恰是此数列中元素从小到大全排列形成的所有数列中的顺序编号.列子 例如有一个数组S= [‘D’, ‘B’, ‘A’, ‘C’],将它带入公式计算,步骤如下: 规定n为数组长度,在此n=4;令规定a[4]=’D’,a[3]=原创 2017-11-14 23:01:06 · 280 阅读 · 0 评论 -
【算法】插入排序 (图解+代码)
#include<stdio.h>void insertion_sort_As(int a[], int n);//升序void insertion_sort_Des(int a[], int n);//降序int main(int argc, char const *argv[]){ int a[10]={9,1,8,2,7,3,6,4,5,0}; in...原创 2017-12-07 15:13:15 · 390 阅读 · 1 评论 -
【算法】筛法求素数
[C语言]筛法求素数经过上一篇文章<用Python寻找质数>,今天用C语言来实现筛法求素数原理用筛法求素数的基本思想是:把从1开始的、某一范围内的正整数从小到大顺序排列, 1不是素数,首先把它筛掉。剩下的数中选择最小的数是素数,然后去掉它的倍数。依次类推,直到筛子为空时结束。—-百度百科 废话不说上代码= =#in原创 2017-11-12 18:04:31 · 665 阅读 · 0 评论 -
【算法】用Python寻找质数
质数(prime number)又称素数,有无限个。质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数,这样的数称为质数。---百度百科在一般领域,对正整数n,如果用2到根号n之间的所有整数去除,均无法整除,则n为质数。质数大于等于2 不能被它本身和1以外的数整除根据以上信息我们就可以设计一个函数: from math import sqrtdef Judge...原创 2017-08-27 00:04:26 · 7000 阅读 · 0 评论 -
【算法】栈,括号匹配
栈,括号匹配import java.util.Scanner;import java.util.Stack;public class Main { public static void main(String[] args){ Stack<Character> stack = new Stack<>(); Scanner...原创 2018-09-11 20:55:51 · 185 阅读 · 0 评论 -
【算法】01背包问题
有n个重量和价值分别为wi,vi的物品。 从这些物品中挑选出总重量不超过W的物品,求所有挑选方案中价值总和的最大值。限制条件1&amp;lt;= n &amp;lt;=1001&amp;lt;=wi,vi&amp;lt;=1001&amp;lt;=W&amp;lt;=10000代码:import java.util.Scanner;public class Main {原创 2018-09-19 21:51:50 · 430 阅读 · 0 评论 -
【数据结构】二叉树的层次遍历
同BFS算法一样,用队列实现。每次遍历先将一层的节点入队,然后在挨个出队,每个节点出队的同时,再将他的子节点入队。循环往复,直到最后队列为空为止。 class TreeNode{ public int val; public TreeNode leftTreeNode; public TreeNode rightTreeNode; ...原创 2018-09-20 23:13:42 · 506 阅读 · 0 评论 -
【数据结构】二叉树的先序遍历
类似于DFS,一条道走到黑,再返回上一层找路。static class TreeNode{ public int val; public TreeNode leftTreeNode; public TreeNode rightTreeNode; TreeNode(int val){ this.val = va...原创 2018-09-20 23:31:52 · 321 阅读 · 0 评论 -
【算法】BFS寻迷宫最短步数
BFS走四方import java.util.LinkedList;import java.util.Queue;public class Main { //方向 static final int[][] next = {{0, 1}, {1, 0}, {-1, 0}, {0, -1}}; //迷宫 static int[][] map = { ...原创 2018-09-21 22:18:47 · 648 阅读 · 0 评论 -
【蓝桥杯】2018.B组.Java.第二题
标题:方格计数如图p1.png所示,在二维平面上有无数个1x1的小方格。我们以某个小方格的一个顶点为圆心画一个半径为1000的圆。你能计算出这个圆里有多少个完整的小方格吗?注意:需要提交的是一个整数,不要填写任何多余内容。题解以圆心为原点,建立直角坐标系。只计算第一象限,最后结果乘以4,即为所求结果。public class Main { private static ...原创 2018-11-08 19:24:14 · 262 阅读 · 0 评论