栈和队列 栈 -stack 首先看看百度的解释: 栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈
AtCoder Beginner Contest 252 E - Road Reduction https://atcoder.jp/contests/abc252/editorial/4005 可以证明,总可以构建出一个生成树,使某一点到其余点的距离,等于原图中某一点到其余点的最小距离。 证明方法为,每次保留最小距离路径的最后一条边。 故可以使用dijkstra算法直接
/**************************** 顺序表 实现双端队列 ****************************/ #define DataType int #define maxn 100005 struct Queue { DataType data[maxn<<1]; int head, tail; }; void QueueClear(struct Queue* que) { que->h
/**************************** 链表 实现队列 ****************************/ typedef int DataType; struct QueueNode; struct QueueNode { DataType data; struct QueueNode *next; }; struct Queue { struct QueueNode *head, *t
题目表述 从左向右遍历一个数组,通过不断将其中的元素插入树中可以逐步地生成一棵二叉搜索树。 给定一个由不同节点组成的二叉搜索树 root,输出所有可能生成此树的数组。 示例: 输入: root = [2,1,3] **输出: **[[2,1,3],[2,3,1]] **解释: **数组 [2,1,3]、[2,3,1] 均可以通过从左向
将(i, a[i])当作点,对a[i]这个维度扫描,在i这个维度上面建立扫描线 #include<bits/stdc++.h> using namespace std; const int N = 2e5+10; array<int, 4> que[N]; array<int, 2> a[N]; // 线段树维护树链剖剖分的dfs序 struct Node{ int l, r; int minn; }tr[4*N]; vo
题目表述 给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 广度优先搜索 首先让根节点入队列,然后遍历队列。 每次循环开始,计算出队列大小,当前的队列大小size就是每一层的节点数。循环这size个节点,依次弹出队列,然后判断当前节点的左右节
A. 4070. 异或 题目链接:https://www.acwing.com/problem/content/4073/ 题目大意:略。 解题思路:简单模拟。 示例程序: #include <bits/stdc++.h> using namespace std; int n, a[11], res; int main() { cin >> n; for (int i = 0; i < n; i++) cin >> a[i];
二叉树的层序遍历 该题为求最小深度 class Solution { public: int minDepth(TreeNode* root) { if (root == NULL) { return } int dep = 0; queue <TreeNode*> que; que.push(root); while (!que.empty()) {
A. 3795. 计算abc 题目链接:https://www.acwing.com/problem/content/3798/ 题目大意:已知三个正整数 \(a \le b \le c\),告诉你 \(a+b,a+c,b+c,a+b+c\),分别求 \(a,b,c\)。 解题思路:比较简单所以直接看代码吧。 示例程序: #include <bits/stdc++.h> using namespace std; int a[4]; i
题目描述 在一个大小为n∗mn∗m的方格地图mp[][]mp[][]上,初始时你在方格(1,1)(1,1)位置。有kk个旅游景点你想去玩。地图中标记为..的方格可以行走,标记为##的方格有障碍物不能经过,标记为数字的方格表示景点的编号。每秒钟你可以朝上,下,左或右移动一格位置,问最少花多少时间走遍k
A. 3770. 最小消耗 题目链接:https://www.acwing.com/problem/content/description/3773/ 题目大意:按照题目要求消灭两种类型怪兽(可以消耗 c 转换)的最小消耗。 解题思路:循环记录 0 和 1 出现的次数,消灭一个 0 的最小消耗为 min(a, b+c),消灭一个 1 的最小消耗为 min(a+c, b)。 示例
核心:队列 1 #include<stdio.h> 2 struct note 3 { 4 int x; 5 int y; 6 int s; 7 8 }; 9 int main(){ 10 struct note que[2501]; 11 int a[51][51]={0},book[51][51]={0}; 12 int next[4][2]={{0,1},{1,0},{0,-1},{
✔做题思路 or 感想 : 用队列实现栈,仅仅用一个队列就可以了 push:直接push进队列就好 pop:把队首加到队尾,直到最开始的队尾变成了队首,这样就可以取最开始的队尾的值了。 peek:这个和pop的操作差不多,但是最后的操作有别。在最后取完队首(即是最开始的栈顶)后,要再把队首加到队尾
智商训练中 缓慢更新中.jpg J. Jealous Split 想不到的转化方式系列( 最优的划分方案一定是和的平方的和最小的子段划分方案 这东西直接$wqs$二分+斜率优化解决就行了 下面证明一下这个结论 考虑一个划分点$k$ 不妨设将$k$右移到$k_1$之后,平方和会变小 也就是说,对于左侧来说,它增加
DFS and BFS 一. DFS的基本概念 深度优先搜索(Depth First Search,简称DFS):一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当搜索遇到阻碍,如节点 的所在边都己被探寻过或者在搜寻时结点不满足条件,搜索将回溯到发现节点 的那条边的起始节点
102. 二叉树的层序遍历 给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 示例 1: 输入:root = [3,9,20,null,null,15,7] 输出:[[3],[9,20],[15,7]] 示例 2: 输入:root = [1] 输出:[[1]] 示例 3: 输入:root = [] 输出:[] 提示: 树中节点数目
深度优先遍历 对于深度优先遍历dfs,我们可以使用递归+回溯进行实现;预先定义一个栈或者队列都行,然后将每次满足的结果加入到集合当中,然后进行递归,再将集合尾部的元素删除进行回溯。 组合总和问题使用深度优先遍历实现代码如下: //定义方法用来实现深度优先遍历 public void
P1434 [SHOI2002]滑雪 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 这道题可以用记忆搜索,也可以用dp,这里我就先讲一下dp的写法【本菜鸟学艺不精,只能写一些简单的dp】 首先,如果要想dp的话,先确定集合的含义; 这里定义集合的含义我一般喜欢从状态转移方程出手【这种方法我发现之
题目搬运者 https://leetcode-cn.com/problems/01-matrix/ 给定一个mxn的二进制矩阵,返回每个单元格最接近0的距离。 两个相邻单元格之间的距离为1。 思路 广度优先算法 从矩阵中是0的位置开始遍历周围一圈将上一步的坐标加入队列,继续遍历周围一圈,有点类似”泛洪“操作为了实
102. 二叉树的层序遍历 思路:简单BFS即可 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x),
title: 每日一练(27):二叉树的深度 categories:[剑指offer] tags:[每日一练] date: 2022/02/26 每日一练(27):二叉树的深度 输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。 例如: 给定二叉树 [3,9,2
title: 每日一练(27):二叉树的深度 categories:[剑指offer] tags:[每日一练] date: 2022/02/26 每日一练(27):二叉树的深度 输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。 例如: 给定二叉树 [3,9,20,nul
力扣:515.在每个树行中找最大值 代码随想录 题目: 给定一棵二叉树的根节点 root ,请找出该二叉树中每一层的最大值。 思路: 正常按层序遍历,for中内容,是从第一层一直到最后一层,首相将第一个元素值赋给标志量,然后后面这一行要删除的元素的值都与这个标志量进行比较,后面的值大则交换
题目地址 解题思路 本题和从上到下打印二叉树Ⅱ基本没差别,就是多了一个间接反转。利用好计数器和mod运算即可。 代码实现(C++) /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeN