![](https://img-blog.csdnimg.cn/20190927151117521.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
算法
00
WKP9418
愿有一天开怀大笑
展开
-
并查集三种Java代码实现
@代码模板package Algorithm;public class UF { private int[] id;//连通分量的id private int count; public UF(int n){//初始化n个触点 count=n; id=new int[n]; for (int i = 0; i < n; i++) { id[i]=i;//初始化时,每个触点都是一个单独的分量原创 2020-08-16 13:10:49 · 220 阅读 · 0 评论 -
归并排序以及三种常见优化
分解:将待排序的n个元素分成n/2两个子序列解决:使用归并排序递归的排序两个子序列合并:合并两个已排序好的子序列来生成排序好的答案。当待排序的序列长度为1时,递归回升,因为这时长度为1的序列,已经排序好了。我们不需要任何操作。这里讲一下具体操作:将要排序的一组数分成两堆(这里我们选取中间点为划分标准),然后我们从两堆中的第一个元素比较,小的(或者大的,这里要求我们是降序还是升序排列)就放到...原创 2019-04-23 21:41:57 · 420 阅读 · 0 评论 -
链表反转
如1->2->3->4->5,反转输出5->4->3->2->1发现对地址这一块不是太熟悉。//节点结构class ListNode { int val; ListNode next; ListNode() {} ListNode(int val) { this.val = val; } ListNode(int val, ListNode next) { this.val = val; thi原创 2020-10-19 18:05:31 · 139 阅读 · 0 评论 -
小白都能看懂最小生成树prime算法
定义不多说,说说代码的实现。队列实现这个实现容易理解,也很容易实现。在加权无向图中,选择一个起点把起点的邻边全部加入到优先队列中。取出队列的头部元素,这个边p的权重目前是最小的。将这个p对应的顶点w加入到生成树里面将w的邻边全部加入到优先队里取出头部元素…用落谷上的题目来说明代码的正确性落谷上的题目邻接表的实现邻接矩阵的实现package Algorithm.WeightGraph;import java.util.ArrayList;import java.util原创 2020-09-12 00:11:23 · 152 阅读 · 0 评论 -
kosaraju算法
深入浅出的用Kosaraju算法计算得到有向图的强连通分量数原创 2020-08-23 17:55:08 · 1814 阅读 · 0 评论 -
快速幂
请在O(logn)时间内求a的n次幂。1.递归版看到logn,自然想到二分。比如求3的12次幂,我们用二分可以写成((32)2 *3)2.O(n)复杂度要乘以n次,这样可以乘以4次。32 一次(32)2 一次(32)2*3 一次((32)2*3)2 一次递归函数:2.非递归版将幂写成2进制形式。当二进制位为0的时候我们不用算,因为就是1.当二进制位为1的时候我们把它乘入即可。因为n约有logn+1个二进制位,所以可以进行logn次乘法,复杂度也满足。剩下的就是如原创 2020-07-09 14:04:12 · 202 阅读 · 0 评论 -
不使用乘法、除法或mod,实现两数相除
保证数据在int范围。被除数÷除数=商+余数需要注意的问题:int 的范围是[-2^31,2^31-1],也就是【-2147483648,2147483647】,如果-2147483648/-1结果会超出int 范围。除法,乘法和mod都不能使用,那可以使用加减,移位。只需保留商即可解法一:每次自增除数当然被除数减去除数也可以。如 10/3,除数自增,10在【3+3+3,3+3+3+3】范围里面。如果被除数取得很大,除数取得很小,那么会很慢。(二者同号情况下)class Soluti原创 2020-07-01 23:38:46 · 1152 阅读 · 0 评论 -
遗传算法解决01背包
import java.util.*;public class test3 { private Random random = null; //随机数生成器 private int[] weight ; //物品重量 private int[] profit ; //物品价值 private int len; // 染色体长度 private float capacity; //背包容量 private int scale; //种群规模 pr原创 2020-06-19 18:29:26 · 296 阅读 · 0 评论 -
二叉树层序生成算法
层序生成大意:先根节点,然后左子树,在右子树。之后,输入一个结点,紧跟着是左右子树。为没有,为结点输入为0.比如结点为 7 3 2 10 9 4 11 0 0 14 0 0 17 0 0 0 0 0 0输入第一个数据,若为零,则此树为空。此树为之后的数据#include<stdio.h>#include<stdlib.h>typedef int elemen...原创 2019-05-04 00:53:25 · 1359 阅读 · 0 评论 -
第k大 or 第k小 or 中位数
c++里面有模板,这里不赘述。主要是c语言实现.主要思想是递归+快排1.用一个数组,进行原址选择,缺点是只能进行一次。将一个数组以某一个元素a作为基准(这里选取最后一个),将这个数组划分,使得左边的元素都比a大,右边的都比a小。当然如果是求第K小,只需对k进行转换即可。#include<stdio.h>void swap(int *a,int *b){ int t=*a;...原创 2019-03-19 12:36:10 · 206 阅读 · 0 评论 -
10000的阶乘是多少
我们首先要明确123*9如何算?3*9=27,进位2,数值为72*9=18,18+进位2=20, 故进位2,数值01*9=9,9+2=11,数值11故答案为1107原创 2019-07-10 13:49:55 · 2774 阅读 · 0 评论 -
希尔排序
希尔排序是插入排序的升级版将一组数按照一个标准数值分组,这个标准数值是多少,我们就分几组之后把每个组内的元素排好序,然后在减小标准数值,在排序,重复此过程直到标准数值为1....原创 2019-07-08 22:57:57 · 271 阅读 · 0 评论 -
双端队列
双端队列(deque,即double-ended queue的缩写)是一种具有队列和栈性质的数据结构,即可(也只能)在线性表的两端进行插入和删除。、看到就直接蒙了,啥玩意???先看一下啥是队列:队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作...原创 2019-06-22 21:35:54 · 21410 阅读 · 5 评论 -
二叉搜索树(binary search tree)的建立、删除、查找
由于输入的数据顺序不同,建立的bst会不一样。最坏的情况就是一个链,所以我们引入了平衡二叉树的概念。这里我们先来看binary search tree。(我随笔里面有一些相关知识)建立(也就是插入)bstree insert(bstree t,element num){ //空树 if(!t){ t=(bstree)malloc(sizeof(binode)); t->d...原创 2019-05-05 17:02:43 · 532 阅读 · 0 评论 -
堆排
堆排,复杂度O(n*lgn)用数组的话,数组第一个元素,即零开始的不能排序。主要思想:用一棵二叉树维护最大堆的性质:根节点比左右儿子都大,左右儿子大小不区分。递归生成此树。#include<stdio.h>void HEAPIFY(int *num,int i,int heap_size)//维护最大堆的函数{ //我们看一个小单元,一个根和左右子树。找出最大的节点 in...原创 2019-04-24 23:28:46 · 124 阅读 · 0 评论 -
前序中序后序遍历的顺序
前序:根左右中序:左根右后序:左右根这三个我懂,但是给出一棵树,写他们的三序遍历,我就有点蒙了;给出图之后,我们先画出遍历路径,此时前序遍历就是遇到结节就访问,中序是从左子树返回时遇到节点就访问,后序是从右子树返回时遇到节点就访问。前序遍历:A B D E G C F H I中序 D B G E A C H F I后序 D G E B H I F C ...原创 2019-09-22 21:18:18 · 3367 阅读 · 0 评论 -
n的全排列
给定一个数n,输出n的全排列递归回溯思路:挖坑填数1.结束条件:所有的坑都填满了,即长度>=n。得到一个解,保存或返回。2.递归主体从第一个坑往后填数数不能重复,所以要用到数组判重这个坑填好,去填下一个坑回溯,,,麻蛋,不会写了。#include<iostream>#include<string>#include<vector>u...原创 2020-03-22 19:31:10 · 723 阅读 · 0 评论 -
从数组中取出m个数相加的结果(组合)
给定一个数组,输入m,求出m个数相加的和。如num[6]={1,2,4,8,16,32};,m=1时,为 1,2,4,8,16,32m=2时,为3,5,6,9,10,12,17,18,20,24,33,34,36,40,48.. . … … . .#include<iostream>#include<set>using namespace std;voi...原创 2020-03-22 23:34:11 · 894 阅读 · 0 评论 -
讲讲n皇后
将n个queen放在一个n*n的棋盘上,要求同一行,同一列,两斜线不能放。这就是个简单的回溯问题。但是如何判断能不能放,这是个难点。当时想着开个二维数组来判断这一个坐标可不可以放。但是这里有个问题,两个queen(1和2)的斜线可能有焦点,那我们回溯的时候会把这个坐标重置(从queen 2回溯回去)。但是这样的话queen 1的斜线没有了作用。queen是从第0行开始放的且一行只能有...原创 2020-04-06 12:06:15 · 137 阅读 · 1 评论