LeetCode
LeetCode 刷题记录
「已注销」
前oi选手。
重庆市南开中学高2020级毕业生。
重庆大学计算机系2020级学生。
QQ1954486214欢迎添加讨论~
展开
-
LeetCode 116 填充每个节点的下一个右侧节点指针【BFS】
单独把这道题提出来,不是因为这道题本身难度有多高,更多的是这道题是一道非常好的检验对树的相关知识和BFS的简单运用的题。class Solution {public: Node* connect(Node* root) { if(root == NULL) return root; queue<Node*> q; q.push(root); while(!q.empty()) { int原创 2021-03-08 20:25:28 · 158 阅读 · 0 评论 -
LeetCode279 完全平方数【暴力DP】
fif_ifi表示数字iii最小可以由fif_ifi个完全平方数组成,构造转移方程:fi=min{fi−k+1}f_i=\min\{f_{i-k}+1\}fi=min{fi−k+1}其中,kkk是完全平方数class Solution {public: static const int M = 1e2+5; static const int N = 1e4+5; static const int Inf = 1e9; int f[N]; int s[M]; inline in原创 2021-03-08 14:32:45 · 85 阅读 · 0 评论 -
LeetCode 787 K 站中转内最便宜的航班【暴力DP转移】
f(i,j)f(i,j)f(i,j)表示到达iii地时已经到达了第jjj个地方时的最短距离记i→i′i\rightarrow i'i→i′是某条边,于是存在转移方程:f(i′,j+1)=min{f(i,j)+val}f(i',j+1)=\min\{f(i,j)+val\}f(i′,j+1)=min{f(i,j)+val}然后暴力枚举i,ji,ji,j即可注意几个小细节1.枚举到i,ji,ji,j时,若当前f(i,j)f(i,j)f(i,j)无穷大,也即始终没有枚举到这个情况,那就不需要继续沿着边原创 2021-03-04 11:09:17 · 152 阅读 · 1 评论 -
LeetCode 474 一和零【01双重背包】
01双重背包定义f(i,j,k)f(i,j,k)f(i,j,k)表示在考虑第111个至第iii个物品后,且使用不超过jjj个0和kkk个1的条件下,能够选取的子集的最大数目。枚举所有状态,转移情况无非就是选取当前字符串与否,转移方程:f(i,j,k)=max(f(i−1,j,k),f(i−1,j−cnt[i][0],k−cnt[i][1]))f(i,j,k)=\max(f(i-1,j,k),f(i-1,j-cnt[i][0],k-cnt[i][1]))f(i,j,k)=max(f(i−1,j,k),原创 2021-03-02 15:03:22 · 136 阅读 · 0 评论 -
LeetCode 778 水位上升的泳池中游泳【并查集】
将每个坐标(xi,yi),xi、yi∈[0,n)(x_i,y_i),x_i、y_i\in[0,n)(xi,yi),xi、yi∈[0,n)看作一个点,计算每个坐标对应的id=xi∗n+yi+1id=x_i*n+y_i+1id=xi∗n+yi+1将每个坐标的高度值单独保存下来,记录最大高度(也即最长时间)maxsizemax_{size}maxsize从零开始枚举到最大高度,用并查集实现将当前可淹没的点连通,在每一次新高度下合并后,查看起始点和终点是否处于同一集合,如果属于,当前高度即为最小时原创 2021-03-01 19:39:11 · 153 阅读 · 0 评论 -
数据结构学习之栈队列链表
文章目录一、链表1.单向链表2.双向链表二、队列三、栈一、链表1.单向链表单项链表应至少满足这样的功能:1.O(1)O(1)O(1)添加元素在链表末尾添加元素,移动tailtailtail指针,建立新节点,赋值。2.O(n)O(n)O(n)插入元素从链表头开始枚举,直到枚举到需要插入元素的位置。改变指针指向,插入元素。3.O(n)O(n)O(n)删除元素从链表头开始枚举,直到枚举到需要删除元素的位置。改变指针指向,删除元素。4.枚举所有元素从链表头开始枚举,直到末尾。另外注意,单向链原创 2021-02-22 10:25:06 · 253 阅读 · 0 评论 -
LeetCode 684 冗余连接【并查集】
一棵树多了一条边,找出这条边。根据树的性质,连通无环无项的性质很容易发现:挨个输入树的每条边时,最开始这条边的两个端点一定是没有连通的,如果连通,则成环,那么这条边就是多余的那条边。class Solution {public: int f[1005]; void init() { for(int i = 1; i <= 1000; i++) f[i] = i; } int find(int x) { return f[x] == x ? x : f[x]=find(f原创 2021-02-22 18:07:55 · 88 阅读 · 0 评论