![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
Magic__Conch
这个作者很懒,什么都没留下…
展开
-
扫描线例题——850. Rectangle Area II
【代码】扫描线例题——850. Rectangle Area II。原创 2022-09-16 13:01:30 · 644 阅读 · 0 评论 -
剑指 Offer 07. 重建二叉树 —— 递归分治、迭代
解题思路1前序遍历的形式:[ 根节点, [左子树的前序遍历结果], [右子树的前序遍历结果] ]中序遍历的形式:[ [左子树的中序遍历结果], 根节点, [右子树的中序遍历结果] ]所以可以分治的求解该问题,难点是确定分治地边界:对前序后中序分别分治,分别传入这两个遍历的左边界和右边界,直到为空结点返回NULL。对每一次分治,前序遍历最左边结点的值是根结点。根据上一步根结点的值,遍历中序序列,获得根结点在中序遍历的下标,获得左子树的长度,然后就可以进行下一轮分治。代码1/** *原创 2022-04-09 10:12:19 · 188 阅读 · 0 评论 -
剑指 Offer 14- I. 剪绳子 —— 贪心
解题思路根据基本不等式,我们知道和相同的情况下,越是平分,乘积越大。所以遍历所有可能的段数,然后算出每个段的乘积,最大的就是最终结果。代码class Solution {public: int cuttingRope(int n) { int ans = 1,now; for(int i = 2;i<n;i++){//i段绳子 int minRope = n/i; int maxRopeCnt = n-m原创 2022-04-07 10:55:38 · 270 阅读 · 0 评论 -
剑指 Offer 13. 机器人的运动范围——广度优先(BFS)
解题思路广度优先搜索代码class Solution {public: int x=0,y=0,now; int sum = 0; queue<int> q; bool vis[10000]; int getDigitSum(int x){ int ans = 0; while(x){ ans+=x%10; x/=10; } return原创 2022-04-07 10:24:00 · 593 阅读 · 0 评论 -
剑指 Offer 12. 矩阵中的路径——dfs+回溯
解题思路简单的递归回溯,注意指针的写法,*优先级低于[]。代码class Solution {public:int len;int* dir;bool vis[201][201];bool flag = false;string word;vector<vector<char>>* board;void dfs(int x, int y, int step) { if (step == len - 1) flag = true;原创 2022-02-18 17:26:42 · 407 阅读 · 0 评论 -
剑指 Offer 04. 二维数组中的查找——二叉搜索树
解题思路这个数组可以被当成二叉搜索树,树根在右上角的元素,若target小于树根则向左查找,大于则向右查找。代码class Solution {public: bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) { int row = matrix.size(); int col = 0; if(row!=0)原创 2022-02-18 11:23:52 · 322 阅读 · 0 评论 -
剑指 Offer 11. 旋转数组的最小数字——递增,简单理解的分类讨论
解题思路看第一个和最后一个元素,分为三种情况:没有翻转:即第一个是最小值进行了翻转:进行递增,从第一个查找,定义遍历step每一轮+1,直到走过头了往回找,O(log n)复杂度。第一个和最后一个相等,可能的情况很多 2 2 2 2 2,2 2 0 1 2… 这种情况下不论是二分还是递增意义都不大,于是直接遍历。代码class Solution {public: int minArray(vector<int>& numbers) { int l原创 2022-02-18 13:00:00 · 189 阅读 · 0 评论 -
剑指 Offer 10- II. 青蛙跳台阶问题——C++动态规划
解题思路青蛙跳到第n层台阶可以通过两种途径:青蛙跳到第n-2层台阶上,然后跳2级青蛙跳到第n-1层台阶上,然后跳1级所以使用动态规划,且仅需保留n前面的两个值,转移方程:f(n)=f(n-1)+f(n-2)代码class Solution {public: int numWays(int n) { if(n==0) return 1; int dp[2]={1,2}; while(--n){ int tm原创 2022-02-18 11:46:13 · 574 阅读 · 0 评论 -
剑指 Offer 10- I. 斐波那契数列 —— C++矩阵快速幂求解
解题思路转移方程:f(n)=f(n-1)+f(n-2),f(n-1)=f(n-1)[f(n)f(n−1)]=[1110][f(n−1)f(n−2)]\begin{bmatrix}f(n) \\f(n-1)\end{bmatrix}=\begin{bmatrix}1 & 1 \\1 & 0\end{bmatrix}\begin{bmatrix}f(n-1) \\f(n-2)\end{bmatrix}[f(n)f(n−1)]=[1110][f(n−1)f(n−原创 2022-02-17 15:13:25 · 385 阅读 · 0 评论 -
CSP 201712-4 行车路线(100)
CSP 201712-4 行车路线(100)问题描述 小明和小芳出去乡村玩,小明负责开车,小芳来导航。 小芳将可能的道路分为大道和小道。大道比较好走,每走1公里小明会增加1的疲劳度。小道不好走,如果连续走小道,小明的疲劳值会快速增加,连续走s公里小明会增加s2的疲劳度。 例如:有5个路口,1号路口到2号路口为小道,2号路口到3号路口为小道,3号路口到4号路口为大道,4号路口到5号路口为小道,相邻路口之间的距离都是2公里。如果小明从1号路口到5号路口,则总疲劳值为(2+2)2+2+22=16+原创 2020-09-11 22:06:39 · 515 阅读 · 0 评论 -
CSP 201712-3 Crontab(100)
CSP 201712-3 Crontab(100)样例输入3 201711170032 2017112223520 7 * * 1,3-5 get_up30 23 * * Sat,Sun go_to_bed15 12,18 * * * have_dinner样例输出201711170700 get_up201711171215 have_dinner201711171815 have_dinner201711181215 have_dinner201711181815 have_原创 2020-09-10 22:14:16 · 230 阅读 · 0 评论 -
CSP 202006-2 稀疏向量(100)
CSP 202006-2 稀疏向量(100)思路:该问题数据两过大,不能将数据从0到n遍历相加(n<10^9)。我的思路是用map存第一个稀疏向量,然后再输入第二组向量时直接进行结果的累加计算。本题提交了两次,第一次90分超时,第二次原样代码提交,100分,时间刚好2.0s。不知道怎样才能有更快的方法。坑点:要注意这种卡时间的问题不要用万能头,否则会极大拖慢运行速度。结果要用long long来存储。同样的代码也有不同的分数?...原创 2020-09-06 17:43:24 · 193 阅读 · 0 评论 -
CSP 202006-1 线性分类器(100)
CSP 202006-1 线性分类器(100)思路:先记录每一个点,再输入线,每次输入线后,对所有的点进行遍历,计算在该线下该每个点的纵坐标值,若>改点的纵坐标则在下侧,否者在上册。#include"bits/stdc++.h"using namespace std;struct Point{ int x,y; char type[2];}point[1006];int n,m,a,b,c;char part[]={' ',' '};int main(){ scanf("%d原创 2020-09-06 17:16:32 · 176 阅读 · 0 评论 -
CSP 201412-3 集合竞价(100)
CSP 201412-3 集合竞价(100)问题描述 某股票交易所请你编写一个程序,根据开盘前客户提交的订单来确定某特定股票的开盘价和开盘成交量。 该程序的输入由很多行构成,每一行为一条记录,记录可能有以下几种: 1. buy p s 表示一个购买股票的买单,每手出价为p,购买股数为s。 2. sell p s 表示一个出售股票的卖单,每手出价为p,出售股数为s。 3. cancel i表示撤销第i行的记录。 如果开盘价为p0,则系统可以将所有出价至少为p0的买单和所有出价至多为原创 2020-09-06 16:45:40 · 436 阅读 · 0 评论 -
CSP 201412-2 Z字形扫描(100)
CSP 201412-2 Z字形扫描(100)问题描述 在图像编码的算法中,需要将一个给定的方形矩阵进行Z字形扫描(Zigzag Scan)。给定一个n×n的矩阵,Z字形扫描的过程如下图所示: 对于下面的4×4的矩阵, 1 5 3 9 3 7 5 6 9 4 6 4 7 3 1 3 对其进行Z字形扫描后得到长度为16的序列: 1 5 3 9 7 3 9 5 4 7 3 6 6 4 1 3 请实现一个Z字形扫描的程序,给定一个n×n的矩阵,输出对这个矩阵进行Z字形扫描原创 2020-09-06 12:21:58 · 114 阅读 · 0 评论 -
CSP 201412-1门禁系统(100)
问题描述 涛涛最近要负责图书馆的管理工作,需要记录下每天读者的到访情况。每位读者有一个编号,每条记录用读者的编号来表示。给出读者的来访记录,请问每一条记录中的读者是第几次出现。输入格式 输入的第一行包含一个整数n,表示涛涛的记录条数。 第二行包含n个整数,依次表示涛涛的记录中每位读者的编号。输出格式 输出一行,包含n个整数,由空格分隔,依次表示每条记录中的读者编号是第几次出现。样例输入51 2 1 1 3样例输出1 1 2 3 1评测用例规模与约定 1≤n≤1,000,.原创 2020-09-06 11:32:16 · 101 阅读 · 0 评论 -
CSP 201409-4最优配餐(100)
CSP 201409-4最优配餐(100)问题描述 栋栋最近开了一家餐饮连锁店,提供外卖服务。随着连锁店越来越多,怎么合理的给客户送餐成为了一个急需解决的问题。 栋栋的连锁店所在的区域可以看成是一个n×n的方格图(如下图所示),方格的格点上的位置上可能包含栋栋的分店(绿色标注)或者客户(蓝色标注),有一些格点是不能经过的(红色标注)。 方格图中的线表示可以行走的道路,相邻两个格点的距离为1。栋栋要送餐必须走可以行走的道路,而且不能经过红色标注的点。 送餐的主要成本体现在路上所花的时原创 2020-09-06 11:22:02 · 370 阅读 · 0 评论 -
CSP 201409-3 字符串匹配(100)
CSP 201409-3 字符串匹配(100)问题描述 给出一个字符串和多行文字,在这些文字中找到字符串出现的那些行。你的程序还需支持大小写敏感选项:当选项打开时,表示同一个字母的大写和小写看作不同的字符;当选项关闭时,表示同一个字母的大写和小写看作相同的字符。输入格式 输入的第一行包含一个字符串S,由大小写英文字母组成。 第二行包含一个数字,表示大小写敏感的选项,当数字为0时表示大小写不敏感,当数字为1时表示大小写敏感。 第三行包含一个整数n,表示给出的文字的行数。 接下来n行,原创 2020-09-05 23:01:24 · 190 阅读 · 0 评论 -
CSP 201409-1 相邻数对(100)
201409-1 相邻数对(100)问题描述 给定n个不同的整数,问这些数中有多少对整数,它们的值正好相差1。输入格式 输入的第一行包含一个整数n,表示给定整数的个数。 第二行包含所给定的n个整数。输出格式 输出一个整数,表示值正好相差1的数对的个数。样例输入610 2 6 3 7 8样例输出3样例说明 值正好相差1的数对包括(2, 3), (6, 7), (7, 8)。评测用例规模与约定 1<=n<=1000,给定的整数为不超过10000的非负整数原创 2020-09-05 22:34:17 · 124 阅读 · 0 评论 -
CSP 201409-2 画图(100)
CSP 201409-2 画图(100)问题描述 在一个定义了直角坐标系的纸上,画一个(x1,y1)到(x2,y2)的矩形指将横坐标范围从x1到x2,纵坐标范围从y1到y2之间的区域涂上颜色。 下图给出了一个画了两个矩形的例子。第一个矩形是(1,1) 到(4, 4),用绿色和紫色表示。第二个矩形是(2, 3)到(6, 5),用蓝色和紫色表示。图中,一共有15个单位的面积被涂上颜色,其中紫色部分被涂了两次,但在计算面积时只计算一次。在实际的涂色过程中,所有的矩形都涂成统一的颜色,图中显示不同颜色仅原创 2020-09-05 19:37:01 · 135 阅读 · 0 评论 -
CSP 201403-4 无线网络(100)
CSP认证 无线网络(80分)问题描述 目前在一个很大的平面房间里有 n 个无线路由器,每个无线路由器都固定在某个点上。任何两个无线路由器只要距离不超过 r 就能互相建立网络连接。 除此以外,另有 m 个可以摆放无线路由器的位置。你可以在这些位置中选择至多 k 个增设新的路由器。 你的目标是使得第 1 个路由器和第 2 个路由器之间的网络连接经过尽量少的中转路由器。请问在最优方案下中转路由器的最少个数是多少?输入格式 第一行包含四个正整数 n,m,k,r。(2 ≤ n ≤ 100,1原创 2020-09-05 19:09:04 · 286 阅读 · 0 评论 -
最简单的字典应用
#include<cstdio>#include<map>using namespace std;int main(){ int m,n,t; map<int,int> dic; scanf("%d%d",&m,&n); for(int i = 0;i<m;i++) for(int j = 0;j<n;j++)...原创 2020-02-24 13:37:59 · 85 阅读 · 0 评论 -
矩阵多维数组应用
#include<cstdio>using namespace std;int main(){ int n,m,ans; const float rWeight = 0.299; const float gWeight = 0.587; const float bWeight = 0.114; scanf("%d%d",&n,&m); int G[...原创 2020-02-24 13:08:53 · 163 阅读 · 1 评论 -
C++文件流输入并显示在控制台上
#include<cstdio>#include<stdio.h>using namespace std;int main(){ char c; freopen("in.txt","r",stdin); while((c = getchar())!=EOF) printf("%c",c); fclose(stdin); return 0;}原创 2020-02-24 12:43:33 · 505 阅读 · 0 评论 -
拓扑排序,按字典序输出
#include<cstdio>#include<queue>#include<string.h> using namespace std;int main(){ int m,n,v1,v2; int indegree[102];//入度 bool G[102][102];//邻接数组存储图 memset(indegree,0,sizeo...原创 2020-02-24 12:18:36 · 597 阅读 · 0 评论 -
用数组实现堆栈(含模板类)
堆栈(Stack)是一种相同数据类型数据的集合,并且拥有后进先出的特性(last in first out,有时候简写为LIFO),所有的操作都在堆栈顶端进行。堆栈具有5种基本操作:创建一个空堆栈 Stack()把数据压入堆栈 Push()从栈顶弹出堆栈 Pop()判断是否为空堆栈 isEmpty()判断堆栈是否已满 isFull()注意:int的0相当于bool的false ...原创 2019-07-14 11:56:16 · 372 阅读 · 0 评论