
【01】方法总结
文章平均质量分 51
介绍一些算法实现
神秘的火柴人
学习不是短时间的冲刺,而是有节制的坚持:)
展开
-
图论系列(六)——图的广度优先遍历及应用2
1. 二分图检测import java.util.LinkedList;import java.util.Queue;public class BipartitionDetection { private Graph G; private boolean[] visited; private int[] colors; //colors[i]:节点i的颜色:0...原创 2020-03-30 17:05:32 · 327 阅读 · 0 评论 -
图论系列(五)——图的广度优先遍历及应用1
1. 树的广度优先遍历与图的广度优先遍历对比原创 2020-03-29 21:15:59 · 494 阅读 · 0 评论 -
图论系列(四)——图的深度优先遍历的应用2
1. 图的环检测无向图有环:当前点的邻接节点已经被访问过被访问过的邻接节点不是当前节点的上个访问import java.util.ArrayList;import java.util.Collections;public class CycleDetection { private Graph G; private boolean[] visited; ...原创 2020-02-15 21:06:07 · 353 阅读 · 0 评论 -
图论系列(三)——图的深度优先遍历的应用1
1. 联通分量统计一个图中联通分量个数判断两点是否联通求每个联通分量中包含点编号import java.util.ArrayList;//Connected Component —— 联通分量public class CC { private Graph G; private int[] visited; //将 boolean型改为 int...原创 2020-02-15 21:04:19 · 608 阅读 · 0 评论 -
图论系列(二)——图的深度优先遍历
1. 树的深度优先遍历与图的深度优先遍历对比2. 代码实现(递归版)import java.util.ArrayList;public class GraphDFS { private Graph G; private boolean[] visited; private ArrayList<Integer> order = new ArrayLis...原创 2020-02-08 20:26:23 · 359 阅读 · 0 评论 -
图论系列(一)——图的基本概念和基本表示
1. 图的分类2. 图的基本概念(联通分量、联通图的生成树)3. 图的基本表示(无向无权图为例)实现代码:import java.io.File;import java.io.IOException;import java.util.ArrayList;import java.util.Scanner;public class AdjMatrix { priv...原创 2020-02-08 14:53:23 · 666 阅读 · 0 评论 -
算法基础——高精度加、减、乘、除
1. 思想大整数——将数字从个位开始存储高精度乘法:高精度除法:2. 模板高精度加法#include<iostream>#include<vector>using namespace std;vector<int> add(vector<int>& v1, vector<int>& v2)...原创 2020-02-03 11:54:55 · 171 阅读 · 0 评论 -
算法基础——二分
1. 思想2. 模板3. 应用数的范围题目链接#include <iostream>using namespace std;const int N = 1e6+10;int arr[N];int main(){ int n, q; scanf("%d %d", &n, &q); for(int i=0;...原创 2020-01-28 22:26:20 · 121 阅读 · 0 评论 -
算法基础——归并排序
1. 思想分治法:选择中间点递归排序左边、右边归并2. 模板#include <iostream>using namespace std;const int N = 1e6+10;int arr[N],tmp[N];void mergeSort(int *arr, int l, int r){ if(l >= r) return ;...原创 2020-01-27 20:23:16 · 116 阅读 · 0 评论 -
算法基础——快速排序
1. 思想分治法选择分界点(arr[l]、arr[mid]、arr[r])调整数组区间(左半部分 < 分界点,右半部分 > 分界点)递归处理左半部分,递归处理右半部分2. 模版#include <iostream>#include <algorithm>using namespace std;const int N = 1e6 +...原创 2020-01-26 21:45:18 · 132 阅读 · 0 评论 -
进阶算法04
无后效性问题:不管通过什么方式到达某个状态,其返回值都一样。1. 换钱的方法数暴力递归以arr = [5, 10, 25, 1],aim = 15为例:节点中的内容表示:从下标为[i~j]的数组中取任意张,可以换到aim的方法数class Solution{public: int coins(int *arr, int len, int aim)...原创 2019-06-23 17:17:25 · 257 阅读 · 0 评论 -
LRU实现
LRU(Least Recnetly Used)最近最少使用淘汰最长时间未被使用的页面思路:依次插入A,B,C:插入A:先从哈希表中查找到A的value,存储的是该节点的地址;在双端队列中将该A节点移到末尾插入D:取出head指向的节点,取出其中的key为B;删除head指向的节点,同时在哈希表中删除;将D插入到末尾class LRUC...原创 2019-06-16 20:04:05 · 422 阅读 · 0 评论 -
Morris遍历
Morris遍历时间复杂度O(N),空间复杂度O(1)遍历规则:如果cur无左孩子,cur向右移动如果cur有左孩子,找到cur左子树上最右的节点,记为mostRight若mostRight的右指针指向为空,让其指向cur,cur向左移动若mostRight的右指针指向cur,让其指向NULL,cur向右移动//先序遍历:在第一次访问节点的时候打印void morri...原创 2019-04-30 20:49:18 · 126 阅读 · 0 评论 -
进阶算法03
Morris遍历时间复杂度O(N),空间复杂度O(1)遍历规则:如果cur无左孩子,cur向右移动如果cur有左孩子,找到cur左子树上最右的节点,记为mostRight若mostRight的右指针指向为空,让其指向cur,cur向左移动若mostRight的右指针指向cur,让其指向NULL,cur向右移动//先序遍历:在第一次访问节点的时候打印void morri...原创 2019-05-01 16:39:20 · 315 阅读 · 0 评论 -
进阶算法02
文章目录1. 窗口2. 单调栈1. 窗口例1:/** *@ w:窗口大小 *@ return:每个窗口中最大值组成的数组*/int *getMaxWindow(int *arr, int len, int w){ deque<int> dqMax; //dqMax存放数组下标 int *ret = new int[len - w + 1];...原创 2019-04-18 19:53:33 · 177 阅读 · 0 评论 -
算法初级04
哈希函数设计RandomPool结构设计一种结构,在该结构中有如下三个功能:insert(key):将某个key加入到该结构,做到不重复加入。delete(key):将原本在结构中的某个key移除。getRandom():等概率随机返回结构中的任何一个key。【要求】 Insert、delete和getRandom方法的时间复杂度都是O(1)布隆过滤器初始化:每个黑名单ur...原创 2019-03-23 22:21:16 · 131 阅读 · 0 评论 -
算法初级03
文章目录1. 二叉树的先序、中序、后序非递归遍历2.在二叉树中找到一个节点的后继节点3.判断一棵二叉树是否是平衡二叉树4. 判断一棵树是否是完全二叉树5.已知一棵完全二叉树,求其节点的个数1. 二叉树的先序、中序、后序非递归遍历void preOrder(Node *root){ if(!root) return ; stack<Node *> s; ...原创 2019-03-16 15:35:02 · 119 阅读 · 0 评论 -
算法初级02
文章目录1.用数组结构实现大小固定的栈和队列2.实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作3.仅用队列结构实现栈结构、仅用栈结构实现队列结构1.用数组结构实现大小固定的栈和队列class arrayStack{private: int *arr; int len; int index; //指向待插入位置public: ...原创 2019-03-15 11:03:44 · 120 阅读 · 0 评论 -
算法初级01
1.估计递归算法复杂度N:样本总量a:递归分支数b:子过程数2.归并排序归并排序2.1 应用小和问题在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和。求一个数组的小和。例子:[1,3,4,2,5]1左边比1小的数,没有;3左边比3小的数,1;4左边比4小的数,1、3;2左边比2小的数,1;5左边比5小的数,1、3、4、2;所以小和为1+...原创 2019-03-12 22:09:36 · 126 阅读 · 0 评论 -
07——AVL(自平衡二叉搜索树)
证明满足二分搜索树证明满足平衡二叉树原创 2019-04-30 22:43:55 · 184 阅读 · 0 评论 -
06——图的基础
文章目录1.图的一种分类:无权图、有权图2.图的表示3.无权图的联通分量、最短路径3.1 深度优先遍历求连通分量3.2 广度优先遍历求最短路径1.图的一种分类:无权图、有权图2.图的表示邻接矩阵实现:// 稠密图class DenseGraph{private: int n, m; // 节点数和边数 bool directed; // 是否为有向图 vector...原创 2019-01-06 22:09:26 · 245 阅读 · 0 评论 -
05——并查集
文章目录1.可以解决连接问题,时间复杂度近似为O(n)2.支持的操作3.实现1(quick find)4.实现2(quick union)优化:unionElements函数方式1:将节点少的根指向节点多的根方式2:考虑层级优化:find函数1.可以解决连接问题,时间复杂度近似为O(n)2.支持的操作unionElements(p, q); //将集合p、q归并find(p); ...原创 2018-12-30 15:45:30 · 323 阅读 · 1 评论 -
04——二分搜索树
文章目录1.二分查找法变种(要查找的元素有多个)2.二分搜索树2.1 定义(与堆区别)2.2 插入2.3 查找(contain、search)2.4 删除删除最小值删除最大值删除任意值2.5 实现floor、celi2.6 实现predecessor、successor1.二分查找法变种(要查找的元素有多个)实现// 二分查找法, 在有序数组arr中, 查找target// 如果找到...原创 2018-12-22 17:08:07 · 145 阅读 · 0 评论 -
03——堆、堆排序(O(nlogm))
文章目录1.二叉堆的定义(最大堆)2.二叉堆的存储3.操作3.1 插入元素(shift up)3.2 取出元素(shift down)4.堆的实现5.堆排序优化1(heapify)优化2(原地堆排序)1.二叉堆的定义(最大堆)2.二叉堆的存储3.操作3.1 插入元素(shift up)插入前:插入后:3.2 取出元素(shift down)取出前:调整后:...原创 2018-12-16 22:31:42 · 498 阅读 · 0 评论 -
02——归并排序、快速排序(O(nlogn))
文章目录1.mergeSort优化应用:逆序对2.quickSort2.1 一次partition操作2.2 partition操作方式1实现方式优化2.3 存在问题(数组近乎有序、数组存在大量重复元素)2.3.1 数组近乎有序解决方法(换图。。。)2.3.2 数组存在大量重复元素解决方法1解决方法21.mergeSort优化应用:逆序对// merge函数求出在arr[l....原创 2018-12-16 13:33:49 · 482 阅读 · 0 评论 -
01——O(n^2)排序
文章目录1.bubbleSort2.selectSort3.insertSort拓展:shellSort1.bubbleSort//如果左边的数字比右边小,就交换template &amp;amp;lt;typename T&amp;amp;gt;void bubbleSort(T arr[], int n){ bool flag; do { flag = false; ...原创 2018-12-15 21:10:41 · 118 阅读 · 0 评论