数据结构和算法
TaoWei_001
开始进入人生下一阶段,请做好准备!
展开
-
剑指offer--数字在升序数组中出现的次数(数组,二分)
普通的循环求解需要O(N)的时间复杂度。这是一个递增序列的数组,符合二分使用单调性的条件。使用二分,则只需要O(logn)时间复杂度。这里由于是原创 2021-06-07 20:17:37 · 141 阅读 · 0 评论 -
剑指offer--二维数组查找(数组,二分)
一般常用的二分查找模板如下:int l = 0, r = n - 1;while(l < r) { int mid = l + r; if (check(mid)) r = mid; else l = mid + 1;}while(l < r) { int mid = l + r >> 1; if (check(mid)) l = mid; else r = mid - 1;}但是本题是一个二维数组,...原创 2021-06-05 11:24:13 · 253 阅读 · 0 评论 -
2020蓝桥杯C++ 研究生组 D题
题目试题 C: 蛇形填数本题总分:10 分【问题描述】如下图所示,小明用从 1 开始的正整数“蛇形”填充无限大的矩阵。1 2 6 7 15 …3 5 8 14 …4 9 13 …10 12 …11 ……容易看出矩阵第二行第二列中的数是 5。请你计算矩阵中第 20 行第 20 列的数是多少?【答案提交】这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。分析:看斜对角线的元素,发现会是一.原创 2021-04-15 16:32:10 · 517 阅读 · 1 评论 -
第十一届蓝桥杯 软件类 c/++ 研究生组 约数个数
试题 A: 约数个数本题总分:5 分【问题描述】对于一个整数,能整除这个整数的数称为这个数的约数。例如:1, 2, 3, 6 都是 6 的约数。请问 78120 有多少个约数。【答案提交】这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。#include <bits/stdc++.h>#include <cstdio>#include <cstring>#inc.原创 2021-04-13 21:15:28 · 231 阅读 · 0 评论 -
AcWing 2066. 解码
不要老想着存储结果,要直接输出结果,这样想题目就会很简单总是陷入要把结果先存下来,再输出的误区,这样做很多题目很难做#include <cstring>#include <iostream>#include <cstdio>#include <algorithm>using namespace std;int main(){ string str; cin >> str; for (int i = 0...原创 2021-04-06 21:13:14 · 142 阅读 · 0 评论 -
AcWing 1240. 完全二叉树的权值
该题主要是二叉树的相关知识考察,掌握二叉树的数学规律,使用两重循环就可以做出来。#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int N = 100010;typedef long long LL;int n;int b[N];int main(){ scanf("原创 2021-03-28 19:12:15 · 246 阅读 · 0 评论 -
AcWing 1113. 红与黑
BFS#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <queue>#define x first#define y secondusing namespace std;typedef pair<int, int> PII;const int N = 25;int n, m;char原创 2021-03-27 11:37:15 · 128 阅读 · 0 评论 -
AcWing 1231. 航班时间
#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;int get_seconds(int h, int m, int s){ return h * 3600 + m * 60 + s;}int get_time(){ string line; getline(cin, l...原创 2021-03-19 16:57:55 · 164 阅读 · 0 评论 -
2021-03-19
注意输入格式,我一开始采用cin的时候,因为必须要输入‘/’字符,所以cin在输入这种格式时会出错误,不会存储正确的值,它会将‘/’字符存在b中日期问题都是这样,要不就在固定的日期区间内进行枚举,要不就先枚举正确的日期printf函数的输入前缀格式#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;原创 2021-03-19 15:34:21 · 111 阅读 · 0 评论 -
2021-03-18
1.闰年的判断2.对于天数的判断,可以直接存在月份数组进行判断,更方便3.如何枚举回文数,和取出一个整数的每一位是一个道理4.如何将一个日期拆分成年月日#include <cstring>#include <iostream>#include <algorithm>using namespace std;int days[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};bool原创 2021-03-18 16:10:28 · 107 阅读 · 0 评论 -
AcWing 1204. 错误票据
题目不难,主要是要注意C++中的输入机制,cin是不能碰到空格,回车的,否则会自动结束。在这种情况下,就需要使用getline函数来进行输入。#include <cstring>#include <sstream>#include <iostream>#include <algorithm>using namespace std;const int N = 10010;int n;int a[N];int main(){.原创 2021-03-18 15:28:27 · 158 阅读 · 0 评论 -
AcWing 895. 最长上升子序列
#include <iostream>#include <algorithm>using namespace std;const int N = 1010;int n;int a[N];int f[N];int main(){ cin >> n; for (int i = 1; i <= n; i++) cin >> a[i]; int res = 0; for (int i = 1; i &l.原创 2021-03-17 14:46:27 · 100 阅读 · 0 评论 -
AcWing 99. 激光炸弹
本题是对于二维前缀和的一个应用,在公式推导之后,尤其要注意数据格式的输入和边界即可R 一定要比 Xi,Yi大 才能覆盖完所有区域为了能枚举所有的目标位置,n,m边界也要等于R,随后跟着输入的目标位置改变#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int N = 5010;int原创 2021-03-11 22:09:24 · 145 阅读 · 0 评论 -
AcWing 796. 子矩阵的和
本题是一维前缀和的扩展,这是一个二维前缀和的题目,主要还是要推导两个公式1.求前缀和的公式,s[i][j] = s[i-1][j] + s[i][j-1] - s[i-1][j-1] + a[i][j]2.利用前缀和结果s[i][j] 求取原矩阵中任意子矩阵的和的公式3.[(x1,y1),(x2,y2)] = s[x2][y2] - s[x2][y1-1] -s[x1-1][y2] + s[x1-1][y1-1]#include <cstdio>#include <cstri原创 2021-03-11 21:13:08 · 145 阅读 · 0 评论 -
AcWing 795. 前缀和
这个还是需要考对题目的理解,然后推导数学公式,得到s[i] = s[i-1] + a[i] sum[l,r] = s[r] - s[l-1]暴力法应该可以解决,但是会超时#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int N = 100010;int n, m;int a[N];原创 2021-03-11 11:30:11 · 189 阅读 · 0 评论 -
AcWing 1227. 分巧克力
第一次写的时候,忘了check函数怎么写,只知道可以向下取整得到最小的边长最重要的是二分的判断条件,块数大于等于边长,从而确定二分的写法#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int N = 100010;int n, m;int h[N], w[N];bool chec原创 2021-03-10 17:05:58 · 94 阅读 · 0 评论 -
AcWing 1221. 四平方和
暴力法,理论上时间复杂度为O(N3)但是实际上,时间反而最短 超时#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <cmath>using namespace std;const int N = 2500010;int n;int main(){ cin >> n;原创 2021-03-09 22:01:27 · 166 阅读 · 0 评论 -
AcWing 790. 数的三次方根
实数二分,不需要考虑中点mid在那个区间,因此只考虑判断条件即可#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;int main(){ double x; cin >> x; double l = -10000, r = 10000; while(r - l ...原创 2021-03-08 21:39:41 · 89 阅读 · 0 评论 -
AcWing 789. 数的范围
1.要分别找两个端点,即两个边界,进行两次二分2.注意两次二分的边界,以及中点计算口诀:左加1右不加1(L = M ; R = M)#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int N = 100010;int n, m;int q[N];int main(){ ..原创 2021-03-07 22:22:40 · 382 阅读 · 0 评论 -
AcWing 1208. 翻硬币
仔细分析问题,发现其实就是一个递推的问题,按照顺序从左向右依次判断是否相等,不相等就改变两个状态相等就继续往下遍历,当遍历完之后,是一定有解的,所以不用使用bfs,因为它只有一个最优解#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int N = 110;int n;char sta原创 2021-03-05 21:49:12 · 117 阅读 · 0 评论 -
AcWing 116. 飞行员兄弟
这道题和费解开关相似,但是又略有不同,主要是枚举方式不一样还有就是开关关闭的方式也不一样#include <cstring>#include <cstdio>#include <iostream>#include <algorithm>#include <vector>#define x first#define y secondusing namespace std;typedef pair<int, int&g原创 2021-03-05 21:05:36 · 307 阅读 · 0 评论 -
AcWing 95. 费解的开关
最重要的是理解第一行的枚举第一行共有5个格子,每个格子都有2种选择,按或者不按,所以共有32种方案对第一行的所有32种方案进行枚举操作重点是,第一行的枚举与第一行的数据无关,因为32种方案里包含了对第一行所有情况的操作因此(op >> i & 1) 判断的是当前是对第几种情况进行操作,step最多每轮也就能加满5次,所以不用担心超过6故对第一行的每一种情况进行判断操作之后,就可以对剩余行进行枚举了而剩余行则是根据上一行的状态所决定的,此时才是通过第一行开原创 2021-03-04 16:08:48 · 209 阅读 · 1 评论 -
AcWing 717. 简单斐波那契
转化为递归搜索树#include <cstdio>#include <cstring>#include <iostream>using namespace std;int f(int n){ if (n == 1) return 1; if (n == 2) return 2; return f(n - 1) + f(n - 2);}int main(){ int n; cin >> n;...原创 2021-03-04 11:21:05 · 169 阅读 · 1 评论 -
AcWing 1209. 带分数
第一次做,使用全排列1.先全排列1~92.再分别枚举a,b,c3.最后判断等式是否成立问题:耗时有点久#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int N = 10;int n;int res;bool st[N];int path[N];/*function:求原创 2021-03-04 10:58:59 · 276 阅读 · 1 评论 -
AcWing 93. 递归实现组合型枚举
与排序型枚举相比,多传入了一个参数,为了保证枚举出来的顺序是从大到小的#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <vector>using namespace std;const int N = 30;int n,m;int way[N];void dfs(int u, int start){原创 2021-03-03 20:57:47 · 160 阅读 · 1 评论 -
AcWing 94. 递归实现排列型枚举
#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int N = 10;int n;int state[N]; //0表示没放数, 1~n表示放了那个数bool used[N]; //true表示用过,false表示没用过void dfs(int u){ if (u .原创 2021-03-03 20:28:19 · 133 阅读 · 1 评论 -
AcWing 92. 递归实现指数型枚举
第一次做的时候,代码提交出问题,后面发现原因是因为边界判断有问题应该是u > n, 而不是u == n#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int N = 16;int n;int st[N]; //状态,记录每个位置当前的状态;0表示还没考虑,1表示选它,2表示不选.原创 2021-03-03 20:15:06 · 241 阅读 · 1 评论 -
Reverse Linked List II
Reverse Linked List IILeecode链接:https://leetcode.com/problems/reverse-linked-list-ii/此题是在Reverse Linked List的基础上改变而成的。整体思路:将需要反转的链表区间单独取出来进行反转,等待反转完之后再重新插入回原链表。因此首先要开辟一个新的链表结点,指向原链表头结点;然后还需要一共四个指针;first用来保存反转链表区间前一个元素的位置last用来保存反转链表区间最后一个元素的位置pre和原创 2020-08-23 20:49:28 · 159 阅读 · 0 评论 -
Reverse Linked List
Reverse Linked List做链表前,一定要分清楚p,p->next 所代表的含义Leecode链接:https://leetcode.com/problems/reverse-linked-list/思路:建立3三个指针,分别指向当前结点,前一结点,后一结点。然后对指针进行移位操作。这里给出一个网上较好的题解,由五分钟算法网站提供:https://www.cxyxiaowu.com/2260.html下面是注释代码:非递归实现/** * Definition for原创 2020-08-23 18:48:13 · 197 阅读 · 0 评论 -
DFS解全排列(2)
DFS解全排列(2)问题描述如图所示,环由n个圆组成。将自然数1,2,…,n分别放入每个圆中,并且两个相邻圆中的数字总和应为素数。注意:第一个圆圈的数量应该始终为1#include<iostream>#include<string.h>#include<stdlib.h>//与第一个全排列问题差不多,只是判断条件变多了using namespace std;int book[25];int result[25];int n;int num;原创 2020-07-03 16:45:14 · 230 阅读 · 0 评论 -
DFS解全排列问题(1)
DFS解全排列问题(1)写了好几版DFS,但是都被删了,实在是不知道从何下手。最后干脆回头一想,不要原理,从实际问题出发,从代码反推原理,终于跟着网页的讲解有了思路。这里先附上我参考的两个链接:假设问题:输入一个数,输出1~n的全排列首先考虑第一种排列方法,自然排列:for(int i=1;i<=n;i++){ a[step]=i;//step代表第几个数,i代表具体的数值}然后考虑,如果在某个位置上,某个数已经被用过,那么在后面的排列中,这个数不能再出现,这个位置上也不能存原创 2020-07-02 22:31:55 · 363 阅读 · 0 评论 -
排序算法(2)-----回到快速排序
排序算法(2)-----回到快速排序前面自己记录了冒泡排序,但是这种排序算法的效率在数据量大了以后会很低。所以我觉得应该再掌握一个排序算法:快排!思路:分治交换,意思就是冒泡排序我要挨着进行交换,太麻烦,那么现在我直接跳着交换,以某个数为基准,大于它的放一边,小于它的放一边,此时先不排序,然后对两个区间内的数再选取一个基准数,进行同样的操作。直到每个区间只有一个数,此时排序完成。下面还是直接上例子:对下列数组进行排序:6,1,2,7,9,3,4,5,10,8我们在这个数组头和尾分别定义一个变量i原创 2020-07-02 19:41:48 · 193 阅读 · 0 评论 -
排序算法(1)----从冒泡排序开始
排序(一)–冒泡排序思路:比较相邻的两个元素的大小直接上例子,对下列数组进行排序(从小到大):10,1,35,61,89,36,55第一次比较:10 和 1,10大于1。交换位置:1,10,35,61,89,36,55第二次比较:10 和 35, 35大于10, 不交换位置,保持原样第三次比较:35 和 61,61大于35,不交换位置,保持原样第四次比较:61 和 89, 89 大于61,不交换位置,保持原样第五次比较:89 和 36, 89大于36,交换位置:1,10,35,61,36,8原创 2020-07-02 15:18:06 · 313 阅读 · 0 评论 -
蓝桥杯训练题目:时间转换
蓝桥杯训练题目:时间转换问题描述给定一个以秒为单位的时间t,要求用“::”的格式来表示这个时间。表示时间,表示分钟,而表示秒,它们都是整数且没有前导的“0”。例如,若t=0,则应输出是“0:0:0”;若t=3661,则输出“1:1:1”。输入格式输入只有一行,是一个整数t(0<=t<=86399)。输出格式输出只有一行,是以“::”的格式所表示的时间,不包括引号。思路:只要数学好点应该都能算,分别求出时,分,秒。注意输出格式就行。#include<iostream>原创 2020-06-27 11:01:16 · 252 阅读 · 0 评论 -
蓝桥杯训练题目:求数列的项C++
蓝桥杯训练题目:求数列的项C++问题描述有一个数列,它的第一项是1,第二项是2,第三项是第一项与第二项的和,后面的项依次类推,即F(1)=1,F(2)=2,F(n)=F(n-1)+F(n-2)(n≥3,n∈N*)输入格式无输出格式输出20行,每行一个数值,表示数列第几项的值。(注意不要输出多余的字符)思路:这其实就是一个简单的斐波那契数列问题,直接采用简单的递归就可以完成。然后存储输出,递归函数注意结束条件。#include<iostream>using namespace原创 2020-06-27 10:17:26 · 787 阅读 · 0 评论 -
蓝桥杯训练题目:(二进制数数)
代码是转载别人的,然后我加了一点注释。先附上转载链接二进制数数代码实现顺便说明一下真正的取余过程。十进制转二进制:用十进制数除以二进制数,得到的每一位余数就是二进制数的构成,但是要倒序输出才是正常的二进制。过程如下:比如整数1010%2 = 0; 10/2= 5;5%2 = 1; 5/2 = 2;2%2 = 0;2/2 =1;注意上一步中因为余数已经为0了,同时下一步中 1/2 = 0;所以除法到这里结束。前面都是取余数,最后一位是商,如果商为0则为0,商为1则为1;然后我转载 2020-06-24 15:19:49 · 429 阅读 · 0 评论