算法总结
文章平均质量分 91
算法总结
小白太白
这个作者很懒,什么都没留下…
展开
-
基本排序算法总结
参考博客:传送门目录各排序时间复杂度冒泡排序选择排序插入排序希尔算法堆排序各排序时间复杂度冒泡排序 /** * 冒泡排序 * 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 * 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。 * 针对所有...转载 2019-03-30 17:36:41 · 114 阅读 · 0 评论 -
改进快速排序算法Java版
快速排序【该改进的算法是在本人已有快排算法的基础上改进的:快速排序】(广泛阅读网上资料整理所得,其中重要参考博客:传送门——感谢!)尽管基本的快速排序已经很有用处了,但是有些情况下,基本的快速排序可能会极为低效,比如排序一个大小为N的有序序列,这样所有的划分就会退化,程序会调用自身N次,所以·快速排序最坏情况下使用大约(N^2)/2次比较我们可以对快速排序进行改进,有以下几种方...原创 2019-03-24 17:29:13 · 1578 阅读 · 1 评论 -
二叉树非递归遍历实现
先序遍历/** * Definition for binary tree * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */import javax.swing.tree.Tree...原创 2019-08-15 23:55:10 · 42 阅读 · 0 评论 -
KMP模式匹配算法简介
时间复杂度:O(n+m)S = ababcabcacbabT = abcac从S的第1个位置开始匹配,当T匹配到S的第3个位置时不相等,可以不回溯S的下一个位置(即第2个位置)重新匹配,因为当前的S串字符a与T的第1个字符a相等,可以使T直接移到S的第3个位置重新匹配。S = ababcabcacbabT = abcac从S的第3个位置开始匹配,当T匹配到S的第7个位置时不相等,同样...原创 2019-08-15 16:41:50 · 143 阅读 · 0 评论 -
树状数组图文解析
树状数组是一个查询和修改复杂度都为log(n)的数据结构。主要用于数组的单点修改、区间求和。lowbit数组lowbit[x] 等于 x 这个数的二进制表示下最低位 1 所对应的十进制数值。(x 默认为非负)例如:lowbit[44] = lowbit[(101100)2] = (100)2 = 4计算那么怎么计算呢,当我们对lowbit[x]进行二进制计算时,可以发现 x &...原创 2019-12-02 23:57:04 · 126 阅读 · 0 评论 -
【CCF】并查集 - 模板例题
问题描述试题编号: 201412-4试题名称: 最优灌溉时间限制: 1.0s内存限制: 256.0MB问题描述: 雷雷承包了很多片麦田,为了灌溉这些麦田,雷雷在第一个麦田挖了一口很深的水井,所有的麦田都从这口井来引水灌溉。 为了灌溉,雷雷需要建立一些水渠,以连接水井和麦田,雷雷也可以利用部分麦田作为“中转站”,利用水渠连接不同的麦田,这样只要一片麦田能被灌溉,则与其连接的麦田也能被灌溉。 现在雷雷知道哪些麦田之间可以建设水渠和建设每个水渠所需要的费用(注意不是所有麦田之间都可以建立水原创 2020-12-11 21:21:23 · 161 阅读 · 1 评论 -
【CCF】tarjan算法-求强联通分量例题
问题描述试题编号: 201509-4试题名称: 高速公路时间限制: 1.0s内存限制: 256.0MB问题描述: 某国有n个城市,为了使得城市间的交通更便利,该国国王打算在城市之间修一些高速公路,由于经费限制,国王打算第一阶段先在部分城市之间修一些单向的高速公路。 现在,大臣们帮国王拟了一个修高速公路的计划。看了计划后,国王发现,有些城市之间可以通过高速公路直接(不经过其他城市)或间接(经过一个或多个其他城市)到达,而有的却不能。如果城市A可以通过高速公路到达城市B,而且城市B也可以通过高原创 2020-12-11 21:12:05 · 320 阅读 · 1 评论 -
循环赛日程表
题目:设有 n = 个运动员要进行羽毛球循环赛,现要设计一个满足以下要求的比赛日程表:(1)每个选手必须与其他 n-1 个选手各赛一次。(2)每个选手一天只能比赛一次。(3)循环赛一共需要进行 n-1 天。思路:从两个运动员开始安排日程表,可以直观的看出结果。然后四个运动员的时候,对角安排结果。以此类推。详细解释见代码参考博客:传送门import jav...转载 2019-03-23 11:06:37 · 692 阅读 · 0 评论 -
KMP算法
引用百度百科的介绍思路:由于直接两层循环求子串匹配主串的位置或次数效率特别低,所以我们需要改进算法,如此KMP算法。改进的关键就是当子串与主串不匹配时,可以使主串上的“指针”(代码中是 j )往回回溯距离最小。那么对于nex数组,是记录子串不匹配时需要回溯的位置。同样需要 i ,j 两个“指针”,i 是当前匹配的位置(依次递增至子串遍历结束),j 是记录匹配回溯的位置。j 和 n...原创 2019-03-19 14:53:07 · 211 阅读 · 0 评论 -
归并排序
引用百度百科的介绍:归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。归并排序是一种稳定的排序方法时间复杂度是O(nlogn)public cl...原创 2019-03-18 16:21:33 · 151 阅读 · 0 评论 -
二叉树的创建和遍历
给定一个确定的数组,然后构建一棵二叉树,并分别使用递归和非递归的方式进行遍历。import java.util.LinkedList;import java.util.List;import java.util.Stack;/** * 建树思路:* 首先把所有的数创建为节点依次存入有序集合中* 对于数列中的前 n/2-1 个都为父节点,因此遍历父节点构建树* 每一个父节...原创 2019-03-18 16:07:40 · 351 阅读 · 0 评论 -
Dijkstra单源最短路算法
Dijkstra单源最短路算法适用情况该算法适用于边权为非负的情况,且最好为稀疏图。目的是求单源最短路。时间复杂度O()有向图、无向图可初始化 map 数组时进行处理。思想该算法采用贪心的策略。①【找距源点最近点】从一指定的源点开始,然后按某一规则找其他的所有(n-1个)点。该规则是:每次找下一个点的时候,那个点必须是之前没有被找到(存储)的,并且是满足该条件的点...原创 2019-04-09 17:32:50 · 280 阅读 · 0 评论 -
会场安排问题(+排序小结)
会场安排问题(最后有排序小结)时间限制:3000 ms | 内存限制:65535 KB难度:3描述 学校的小礼堂每天都会有许多活动,有时间这些活动的计划时间会发生冲突,需要选择出一些活动进行举办。小刘的工作就是安排学校小礼堂的活动,每个时间最多安排一个活动。现在小刘有一些活动计划的时间表,他想尽可能的安排更多的活动,请问他该如何安排。输入 第一行是一个整型数m...原创 2019-04-09 16:21:22 · 1011 阅读 · 0 评论 -
不用加减乘除进行加法运算
题目写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。思路刚看到题的时候想到了位运算,但是不懂怎么用。看了大量网上的解法,仍然似懂非懂,后来画图然后才终于懂了。顺应网上的大多数例子,5+17的例子。对于十进制的加法 5+17=22 如何计算,实际上,可以分三步进行:第一步只做每位相加不进位,此时相加的结果是12,第二步做进位,5+7中有进位,进位的值为1...原创 2019-03-26 16:46:29 · 357 阅读 · 0 评论 -
投资分配问题
题目现有数量为a(万元)的资金,计划分配给n 个工厂,用于扩大再生产。假设 xi 为分配给第 i 个工厂的资金数量(万元);gi(xi)为第i 个工厂得到资金后提供的利润值(万元)。问题:如何确定各工厂的资金数,使得总的利润为最大。分析根据题目分析可以得到下面的关系:令:fk(x) = 以数量为x 的资金分配给前k 个工厂,所得到的最大利润值。用动态规划求解,就是求 f...原创 2019-04-23 21:09:49 · 2252 阅读 · 0 评论 -
字符串的翻转总结
字符串的翻转总结题目一给定一个字符串,如 "csdn",编写函数返回翻转为"ndsc"的结果。思路不考虑库函数的情况下,采用递归的方式,每次返回 从第二位开始的子串(同时递归下去) 加上 第一位字符 ,直到递归到剩下一个字符则直接返回即可。public class Solution { public static void main(String[] args) {...原创 2019-04-23 15:03:22 · 667 阅读 · 0 评论 -
Prim最小生成树算法
Prim最小生成树算法适用情况以点为主线贪心搜索,适合与稠密图。时间复杂度为 O()思想①【初始化(最短距离)】将所有的点分成两个集合,一个是已经被选上的点集(默认有一个起始点);另一个是待选点集。用一个数组存源点到其他所有点的最短距离(即最小花费)②【找最近点】循环 n-1 次(用上所有的点找最小的花费)找点的时候,每次从没被选上的点集中找到一个点,该点满足是到被选...原创 2019-04-11 16:59:45 · 194 阅读 · 0 评论 -
Kruskal最小生成树算法
Kruskal最小生成树算法适用情况以边为主线贪心搜索,判断连通图时需要用到并查集时间复杂度为 (n 为边的数量)思想①【边按升序排序】将所有的边从小到大排序,然后依次取边判断是否成环(相连)②【不连通时加边】若不相连则连接,并记录边的个数;否则不相连③【控制边的个数】最后使边的个数达到 n-1 个即可得到最小生成树import java.util.Arr...原创 2019-04-11 16:05:53 · 232 阅读 · 0 评论 -
计算任意多边形的面积(+判一个点是否在多边形内)
题目按顺序给定一个多边形顶点坐标(x, y),求其面积。附加:若再给定一个点,求该点是否在此多边形上(在边界上也算)思路利用向量的点积求面积,参考博客:传送门附加:以该点为起点,加入多边形的点中计算面积,若最后结果和原多边形相等,则表示该点在此多边形上。import java.util.*;public class Solution { public sta...原创 2019-04-11 15:46:27 · 336 阅读 · 0 评论 -
SPFA单源最短路算法
SPFA单源最短路算法适用情况与 Dijkstra 算法类似,只不过该算法可以判断是否存在负环(不能处理负环)。目的是求单源最短路。时间复杂度为 O(nm)该算法可由 Dijkstra 算法替换使用,优于其在于可判断负环。思想Bellman-Ford 的改进版。(下述代码采用领接表存储数据)①【初始化(队列、标记数组等)】创建一个队列,将源点加入队列中并做相关处理...原创 2019-04-09 20:18:29 · 210 阅读 · 0 评论 -
不用加减乘除做加法
题目描述写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。思路之前做过,现在学过了计算机组成原理之后这个原理变得更清晰了。其实就是简单模拟计算机内部二进制的两数相加,正好抑或运算是相加不进位的结果,与运算是进位的结果,之后让进位的结果左移再相加来实现“竖式运算”的模拟。没有对溢出做出处理public class Solution { public ...原创 2019-07-19 22:13:43 · 50 阅读 · 0 评论 -
Java自定义类排序
类内排序类内排序采用实现 Comparable 接口的方式(重写 compareTo 方法)规则:与本(或第一个)对象相比,若本(或第一个)对象大于另一个对象则返回1,小于则返回-1,相等则返回0;按此规则排序是升序排序,调换返回值则反向排序。当返回0时按原相对位置排序import java.util.Arrays;public class Solution { stati...原创 2019-07-19 21:37:41 · 540 阅读 · 0 评论 -
异或运算的作用
异或运算:相同为0,不同为1参考博客链接特点0 ^ 任何数 = 01 ^ 对应二进制位的数即为对应位取反任何数 ^ 自己 = 置0常见用途使某些特定的位取反例如:对二进制 1010 的第一位和第四位取反,则1010 ^ 1001 = 0011不使用临时变量交换两个变量的值int a = 1;int b = 2;a = a ^ b;b = b ^ a;a ...原创 2019-07-25 00:04:27 · 504 阅读 · 2 评论 -
浅谈堆排序
若在输出堆顶元素(即最大值)后,使得剩余n-1个元素的序列重新又成一个堆,则得到n个元素的次大值......如此反复,便能得到一个有序序列,这个过程称之为堆排序。(以大顶堆为例,结果为升序排序)实质上,堆排序就是利用完全二叉树中父节点与孩子节点之间的内在关系来排序的。小根堆:根节点值小于等于左右孩子节点的值,子树亦然。大根堆反之同理。大顶堆->升序【因为排序中是逆序存储,具体见代...原创 2019-08-20 12:58:26 · 120 阅读 · 0 评论 -
哈夫曼树的构造与编码实现
运行截图import java.util.Scanner;public class Main { public static void main(String[] args) { Scanner cin = new Scanner(System.in); System.out.println("请输入节点数:" ); int...原创 2019-08-18 00:49:16 · 161 阅读 · 0 评论 -
闰年判断
闰年中2月29天判断公式同时满足三个条件:①能被4整除②不能被3200整除③能被400整除 或者 不能被100整除if(y % 4 == 0 && y % 3200 != 0 && (y % 400 == 0 || y % 100 != 0)) System.out.println("是闰年");...原创 2019-10-08 19:14:09 · 98 阅读 · 0 评论 -
线段树解析
线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。使用线段树可以快速的查找某一个节点在若干条线段中出现的次数,时间复杂度为O(logN)。而未优化的空间复杂度为2N,实际应用时一般还要开4N的数组以免越界,因此有时需要离散化让空间压缩。线段树思想引言:给定一个数组,不断询问数组区间[L, R]的和 或 改变某一位置的值,怎么实现...原创 2019-12-03 18:19:23 · 64 阅读 · 0 评论 -
根据日期计算星期
基姆拉尔森计算公式:W= (days + 2 * month + 3 * (month + 1) / 5 + year + year / 4 - year / 100 + year / 400) % 7 + 1注意: 当month = 1或2时,需要month + 12并且year - 1输出1,代表周一(最后+1的结果,原公司无,可自行百度该公式)相关题目:CSP认证考试2015年3月的...原创 2020-09-27 19:09:12 · 687 阅读 · 0 评论 -
P3371 【模板】单源最短路径(弱化版)
P3371 【模板】单源最短路径(弱化版)输入输出样例输入样例#1: 复制4 6 11 2 22 3 22 4 11 3 53 4 31 4 4输出样例#1: 复制0 2 4 3说明时空限制:1000ms,128M数据规模:对于20%的数据:N<=5,M<=15;对于40%的数据:N<=100,M<=10000;...原创 2020-11-12 13:26:52 · 57 阅读 · 0 评论