begin

Leetcode 95.不同的二叉搜索树II

↘锁芯ラ 提交于 2019-11-29 23:22:09
不同的二叉搜索树2 给定一个整数 n ,生成所有由 1 ... n 为节点所组成的 二叉搜索树 。 示例: 输入: 3 输出: [ [1,null,3,2], [3,2,null,1], [3,1,null,null,2], [2,1,3], [1,null,2,null,3] ] 解释: 以上的输出对应以下 5 种不同结构的二叉搜索树: 1 /** 2 * Definition for binary tree 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8 * }; 9 */ 10 class Solution { 11 public : 12 vector<TreeNode *> generateTrees( int n) { 13 vector<TreeNode *> ret; 14 if (n == 0 ) 15 return ret; 16 return Helper(1 , n); 17 } 18 vector<TreeNode *> Helper( int begin, int end) 19 { 20 vector<TreeNode *> ret;

Codeforces Round #575 (Div. 3) F. K-th Path

做~自己de王妃 提交于 2019-11-29 23:19:44
传送门 题意: 这道题把我看得懵懵的(不敢相信),其实就是给你n个点和m条边(无向图),你要找出来任意两点之间的的最短距离,然后再从其中找出来第k个最小值 题解: 正常思维就是floyd多源最短路算法跑一遍,然后把任意两点之间的距离取出来放在数组里面,再排序。之后打印出第k个就可以了 但是n的范围是2e5,然而数组开不了这么大的,所以这里有一点优化的。因为要求第k大的距离,所以我们对所有边排序,取出来前k条边,用这k条边的端点(可以离散化把点的值变小)来重新构造一个图 至于为什么可以这样做,我们可以实践一下,如果这k条边互相不相连,那么第k个大的边(而且这个边还是最短的,正好相当于两点之间的最短路),正好符合题意(因为我们这k条边是在所有边中最小的k个,其他的边肯定要大于等于它) 如果相连了,那么也可以构造出来新的更短的距离,只有这个新的两点之间的距离小于等于咱们挑出来的边才会使用到,所以这样也符合题意 代码: 1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstring> 5 #include<map> 6 #include<set> 7 #include<vector> 8 #include<algorithm> 9 #include<queue> 10 #include

Sink

主宰稳场 提交于 2019-11-29 22:29:48
说明文档 Consumer 的扩展,用于在流管道的各个阶段处理值,并且提供了额外的方法去管理大小信息、控制流程等 在首次调用 Sink 的 accept() 方法之前,必须首先调用 begin() 方法去通知其数据即将过来(视情况还会通知 Sink 有多少数据即将过来),在所有数据发送过来后,必须调用 end() 方法。 begin 与 end 之间调用 accept 在调用了 end() 方法后,就不应该再调用 accept() 方法,除非再次调用 begin() 方法 Sink 还提供了一种机制,sink 可以发出不希望再接收更多数据的信号 一个 Sink 可以处于下述两个状态之一 初始状态 与 激活状态 由初始状态起步 begin() 方法会将其准换为激活状态 end() 方法又会将其转换会初始状态 因此它可以被重用 数据接受方法(如 accept())只在激活状态下有效 apiNote 一个流管道包括一个源、零个或多个中间阶段(比如过滤filter或映射map),和一个终止阶段(比如 reduction 或 for-each) 一个 Sink 实例用于表示当前管道中的每一个阶段,无论阶段接收的是 objects、longs,或doubles 对于 accept(Object)、accept(int) 等,Sink 拥有一个入口点

vector方法

a 夏天 提交于 2019-11-29 19:38:18
借鉴网上资料,整理了vector使用的一些方法,记录下来,方便以后查阅 vector初始化 vector<int>a(10) //只定义长度 vector<int>a(10,1)//长度为10,初始值为1 vector<int>a(b); //用b向量来创建a向量,整体复制性赋值 vector<int>a(b.begin(),b.begin+3); //定义了a值为b中第0个到第2个(共3个)元素 int b[7]={1,2,3,4,5,9,8};vector<int> a(b,b+7); //从数组中获得初值 vector对象的操作 a.assign(b.begin(), b.begin()+3);//b为向量,将b的0~2个元素构成的向量赋给a a.assign(4,2);//是a只含4个元素,且每个元素为2 a.back();//返回a的最后一个元素 a.front();//返回a的第一个元素 a[i]; //返回a的第i个元素,当且仅当a[i]存在2013-12-07 a.clear();//清空a中的元素 a.empty();//判断a是否为空,空则返回ture,不空则返回false a.pop_back();//删除a向量的最后一个元素 a.erase(a.begin()+1,a.begin()+3);//删除a中第1个(从第0个算起)到第2个元素

牛客 子矩阵最大累加和问题

↘锁芯ラ 提交于 2019-11-29 19:16:22
题目链接: https://www.nowcoder.com/practice/cb82a97dcd0d48a7b1f4ee917e2c0409?tpId=101&tqId=33095&tPage=1&rp=1&ru=/ta/programmer-code-interview-guide&qru=/ta/programmer-code-interview-guide/question-ranking 题目大意:   略。 分析:    略. 代码如下: 1 #include <bits/stdc++.h> 2 using namespace std; 3 4 #define INIT() ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); 5 #define Rep(i,n) for (int i = 0; i < (int)(n); ++i) 6 #define For(i,s,t) for (int i = (int)(s); i <= (int)(t); ++i) 7 #define rFor(i,t,s) for (int i = (int)(t); i >= (int)(s); --i) 8 #define ForLL(i, s, t) for (LL i = LL(s); i <= LL(t); ++i) 9

牛客 计算数组的小和

早过忘川 提交于 2019-11-29 19:12:57
题目链接: https://www.nowcoder.com/practice/edfe05a1d45c4ea89101d936cac32469?tpId=101&tqId=33089&tPage=1&rp=1&ru=/ta/programmer-code-interview-guide&qru=/ta/programmer-code-interview-guide/question-ranking 题目大意:   略。 分析:    归并排序,求类似逆序对的东西,没看出来需要面壁. 代码如下: 1 #include <bits/stdc++.h> 2 using namespace std; 3 4 #define INIT() ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); 5 #define Rep(i,n) for (int i = 0; i < (int)(n); ++i) 6 #define For(i,s,t) for (int i = (int)(s); i <= (int)(t); ++i) 7 #define rFor(i,t,s) for (int i = (int)(t); i >= (int)(s); --i) 8 #define ForLL(i, s, t) for (LL i = LL(s); i

百度之星2019第一场1002 Game

我的梦境 提交于 2019-11-29 18:21:54
思路: 离散化之后dp,dp[i][j]表示完成前i个任务并且处在第j个点所需要的最小代价。 实现: 1 #include <bits/stdc++.h> 2 using namespace std; 3 pair<int, int> a[1005]; 4 int dp[1005][4005]; 5 int main() 6 { 7 ios::sync_with_stdio(false); 8 int T, n; cin >> T; 9 while (T--) 10 { 11 cin >> n; 12 vector<int> v; 13 for (int i = 1; i <= n; i++) 14 { 15 cin >> a[i].first >> a[i].second; 16 v.push_back(a[i].first); 17 v.push_back(a[i].second); 18 if (a[i].first < a[i].second - 1) 19 { 20 v.push_back(a[i].first + 1); 21 v.push_back(a[i].second - 1); 22 } 23 } 24 sort(v.begin(), v.end()); 25 v.erase(unique(v.begin(), v.end()), v.end()); 26

STM32F429 利用CUBEMX移植FATFS文件系统成功!!!

和自甴很熟 提交于 2019-11-29 17:26:26
文件系统对于一个专业的嵌入式系统而言必不可少,博主这两天利用STM32F429成功移植了FATFS,特来分享一下学习心得,避免新人采坑。 我是在SD卡上实现的,因此你需要利用SDIO接口扩展一个SD卡,具体实现如下: 进入Configuration界面,基本参数的不用配置,但是需要开启中断和DMA,配置如下: 点击OK,关闭Configuration窗口。 在MiddleWares下拉列表中打开FATFS,选中SD卡。 进入FATFS的Configuration界面,配置如下: 解释一下改动的两个参数,一个选择读取中文类型的文件,另一个是使能长字节名称命名(如果不选择,只有8字节,超过8字节会出现Hardware Fault),文件系统的磁盘选择3个(方便挂载其他内存) 最后,再设置选择中,把stack的空间大小设置为0X1000大小。 以上,便完成可在CUBEMX中配置FATFS文件系统,点击生成工程文件。 可以看到,在工程目录下,生成了这样一些文件: 具体什么内容先不管,我们需要在main中添加一些代码测试我们的文件管理系统。 首先添加如下所示的全局变量: /* USER CODE BEGIN PV */ /* Private variables ---------------------------------------------------------*/ uint32

动态DP教程

匆匆过客 提交于 2019-11-29 17:18:49
目录 前言 开始 更进一步 前言 最后一届NOIP TG的day2T3对于动态DP的普及起到了巨大的作用。 然而我到现在还不会 开始 SP1716 GSS3 - Can you answer these queries III 题解位置 这道题的题目大意就是维护动态序列最大子段和。一个比较显然的想法就是用线段树维护 \(lmax,rmax,sum,max\) 即可。但是我们不想放弃DP的优良性质,于是就有了优良的动态DP。 对于这道题目,如果不考虑修改操作,那么DP就是这样的: 令 \(F[i]\) 表示以 \(A[i]\) 为结尾的最大子段和, \(G[i]\) 表示到 \(i\) 为止的答案,那么不难发现 \[ F[i]=A[i]+\max\{F[i-1],0\}\\ G[i]=\max\{G[i-1],F[i]\} \] 下一步就是把转移改写为矩乘的形式。能够改写是因为矩乘基于乘法对加法的分配律。而max同样对加法有分配律。也就是说: \[ a(b+c)=ab+ac\\ a+\max\{b,c\}=\max\{a+b,a+c\} \] 这样,上面的Dp就可以变成这个样子: \[ F[i]=\max\{A[i]+F[i-1],A[i]\}\\ G[i]=\max\{G[i-1],F[i-1]+A[i],A[i]\} \] 那么转移矩阵就应该是一个 \(3\times3\)

线性代数的深入理解

。_饼干妹妹 提交于 2019-11-29 10:46:30
线性代数笔记 关于矩阵理解 reference: 矩阵理解 图片来源: b站上的教程 线性变换 所谓变换,其实就是空间里从一个点(元素/对象)到另一个点(元素/对象)的跃迁 矩阵是线性空间中的线性变换的一个描述。在一个线性空间中,只要我们选定一组基,那么对于任何一个线性变换,都能够用一个确定的矩阵来加以描述。 比如有一头猪,你打算给它拍照片,只要你给照相机 选定了一个镜头位置 ,那么就可以给这头猪拍一张照片。这个照片可以看成是这头猪的一个描述,但只是一个片面的的描述,因为 换一个镜头位置 给这头猪拍照,能得到一张不同的照片,也是这头猪的另一个片面的描述。所有这样照出来的照片都是这同一头猪的描述,但是又都不是这头猪本身。 同样的,对于一个线性变换,只要你 选定一组基 ,那么就可以找到一个矩阵来描述这个线性变换。 换一组基 ,就得到一个不同的矩阵。所有这些矩阵都是这同一个线性变换的描述,但又都不是线性变换本身。 若矩阵A与B是同一个线性变换的两个不同的描述(之所以会不同,是因为选定了不同的基,也就是选定了不同的坐标系),则一定能找到一个非奇异矩阵P,使得A、B之间满足这样的关系就是相似: A = P − 1 B P A=P^{-1}BP A = P − 1 B P 那么重新来理解一下 $ Ma=b $ 等价于 M a = I b Ma=Ib M a = I b ,意思是说**