![](https://img-blog.csdnimg.cn/20190918140213434.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
算法套路和模板
模板化刷题
MOLS自恒
这个作者很懒,什么都没留下…
展开
-
BFS的解题模板
BFS作为可以得出最短路径的暴力搜索方法,在很多问题上都是可以直接使用的。直接给自己一个模板方便之后使用。 //一般来说是默认是一步的 int step = 1; Set<String> visited = new HashSet<>(); Queue<String> q = new LinkedList<>(); q.offer("0000"); visited.add("0000")原创 2022-05-08 20:16:00 · 431 阅读 · 0 评论 -
动态规划系列问题—从小白到大佬的入门、进阶之旅
前言本篇文章写了将近一万五千字,整理了关于动态规划系列问题的绝大部分分支,包括动态规划的介绍,相关术语等基础内容,也有区间DP,状压DP等进阶知识。不管你是刚学习该算法的小白,还是对该算法有了一定了解的人,这篇文章你都可以仔细认真的耐心来学。对于小白来说,这是一个了解该算法并可以从小白蜕变成大佬的绝佳场地,能够帮助你在动态规划问题上变得游刃有余。千里之行,始于足下,学习的事不是一蹴而就的,希望你们能从这篇文章中有所收获!文章目录 前言 一.什么是动态规划 二.动态规划术语转载 2021-02-14 11:41:59 · 171 阅读 · 0 评论 -
蓝桥杯2018年(第9届)省赛b组c/c++ 测试次数
x星球的居民脾气不太好,但好在他们生气的时候唯一的异常举动是:摔手机。各大厂商也就纷纷推出各种耐摔型手机。x星球的质监局规定了手机必须经过耐摔测试,并且评定出一个耐摔指数来,之后才允许上市流通。x星球有很多高耸入云的高塔,刚好可以用来做耐摔测试。塔的每一层高度都是一样的,与地球上稍有不同的是,他们的第一层不是地面,而是相当于我们的2楼。如果手机从第7层扔下去没摔坏,但第8层摔坏了,则手...原创 2020-02-22 14:11:27 · 177 阅读 · 0 评论 -
二叉树的最近公共祖先节点
“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)”。给出两个节点找到二叉树的公共节点,下图中而可以发现,给出节点5,1,最近公共节点是3。直接给出代码。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *r.原创 2021-09-19 10:21:41 · 287 阅读 · 0 评论 -
二叉搜索树和累加树
二叉搜索树包含以下约束条件:节点的左子树仅包含键小于节点键的节点。 节点的右子树仅包含键大于节点键的节点。 左右子树也必须是二叉搜索树。可以知道使用中序遍历可以快速的输出从小到大的有序序列。累加树是使得每个节点的值是原来的节点值加上所有大于它的节点值之和。二者的关系就是中序遍历二叉搜索树然后从最后一个数字开始往前遍历累加,即可得出结论。如果用代码实现可以使用中序遍历先访问右节点,再访问左节点即可达到从大到小访问,依次累加即可。 int sum = 0; Tr...原创 2021-09-12 10:24:08 · 962 阅读 · 0 评论 -
数组中的第K个最大元素和第k个最小元素
这里我们选择第k个最大元素来做实例。第一反应是这个题目似乎很简单,直接遍历,每一次挑最大的元素放入数组,最后就可以得到我们想要的结果,但是这个时间复杂度太高, O(K * n)。当 K 是比较小的常量时,时间复杂度是 O(n);但当 K 等于 n/2 或者 n 时时间复杂度就是 O(n^2) 了。我们需要用到在快排中的划分区间的方法。我们选择数组区间 A[0...n-1]的最后一个元素 A[n-1]作为 pivot,对数组 A[0...n-1]原地分区,这样数组就分成了三部分,A[0...p-1]、A[原创 2021-08-25 09:58:47 · 254 阅读 · 0 评论 -
罗马数字转整数和整数转罗马数字
先说说整数转罗马数字,直接看一看力扣上的题目吧。罗马数字包含以下七种字符:I,V,X,L,C,D和M。字符 数值I 1V 5X 10L 50C 100D 500M 1000例如, 罗马数字 2 写做II,即为两个并列的 1。12 写做XII,即为X+II。 27 写做X...原创 2021-05-15 10:47:37 · 170 阅读 · 0 评论 -
计算机中的异或运算
简单说一下计算机的异或运算,在计算机中,我们直接拿c语言举例子吧。比如1^3,应该如何计算,以四位二进制数为例,那就是0001和0011异或运算,可以知道结果应该是0010,也就是2;好了这就是异或运算的基本运算方式了。做一个简单的运算我们定义a^b=c,那么可以知道a^b^b=a,则c^b=a;同理c^a=b。利用这个一个思路我们可以用异或操作进行交换。 a = a ^ b; b = a ^ b; a = a ^ b;是不是很简单呢。下面做一个简单的应用。未知 整数...原创 2021-05-06 10:34:52 · 3485 阅读 · 0 评论 -
整数反转(经常见到的反转类型题目)
正数反转类型的题目,不管是在竞赛中还是在日常写代码的过程中都经常会遇到,虽然不是很难,但是写起来也会有一点磕绊,尤其是还有正数和负数的区别,不过总体上还是很简单的,下面给一个相关的模板。 int reverse(int x) { long num=0; while(x!=0) { num = num*10 + x%10; x /= 10; } //这里可以不用直接删去即可,检测原创 2021-05-03 12:11:29 · 162 阅读 · 0 评论 -
最短路径的模板题目(dijkstra)
给定一个N M分别表示点的个数,边的条数,然后定一个S表示开始的位置6 8 0下面的8个输入分别表示两个点之间的距离,比如0 1 1,表示0点到1点距离为10 1 10 3 40 4 41 3 22 5 13 2 23 4 34 5 3下面给出实现的模板#include <iostream>#include <algorithm>#define MAXN 100#define INF 1000000 using namespace std;.原创 2020-05-31 10:54:00 · 351 阅读 · 0 评论 -
岛屿数量(图连通题目)
给定一个M N,表示这个整型数组的大小6 70 1 1 1 0 0 10 0 1 0 0 0 00 0 0 0 1 0 00 0 0 1 1 1 01 1 1 0 1 0 01 1 1 1 0 0 00表示海水,1表示陆地,一堆连起来的1表示一个岛屿,求出岛屿数这个题目是典型题目,我们下面给出BFS的解法:#include <iostream>#include <queue> #define MAXN 100using namespace std.原创 2020-05-31 10:39:20 · 463 阅读 · 0 评论 -
迷宫(BFS)
给定一个字符数组M N,表示迷宫的行数和列数。输入迷宫数组"."表示路径通畅,“*”表示有障碍物。S为开始的位置,T为出口。下面给出迷宫的出口和入口。输入样例:5 5......*.*..*S*..***....T*2 2 4 3一个固定的解题模板#include <iostream> #include <queue>#define MAXN 100using namespace std;struct node{ int x; int..原创 2020-05-31 10:33:18 · 207 阅读 · 0 评论 -
堆排序的实现
这里直接使用大根堆我们可以发现在二叉堆中,注意这里以下标1为数组的起始位置。父节点k的子节点为2*k和2*k+1根据这个规律,我们可以用数组来表示排序好的大根堆,利用上面说的父节点和子节点的规律进行排序。我们定义一个sink函数,比较在一个父节点下哪一个子节点更大,将这个更大的节点与父节点比较,如果大于父节点将其与父节点交换。直接上代码#include <iostr...原创 2020-02-11 21:03:14 · 99 阅读 · 0 评论 -
买卖股票6种类型
股票类型的问题很繁多,有许多变种,这里全部简写,把常见的几种变种列举出来下面规定股票买卖次数为k第一种,买卖次数k为一次int maxProfit(vector<int>& prices) { int n=prices.size(); int dp_i_0=0,dp_i_1=-10000; for(int i=0;i...原创 2020-02-09 21:21:23 · 378 阅读 · 0 评论