10 2022 档案
摘要:题目描述 给定我们一棵树,和一组查询,每个查询给出一个节点,让我们求删除以这个节点为根(包括这个节点)的子树中的所有节点之后(并不是真的删除),剩下的树中节点的最大高度。(树的高度是从根到树中某个节点的 最长简单路径中的边数 。) 思路 序列 对于树的题目,学习到了一种新的算法(思路)
阅读全文
摘要:题目描述 最长非递减子序列 思路 Reference 代码
阅读全文
摘要:题目描述 方格探索 思路 最简单的思路:,遍历所有的点,只需要额外记录左右走的次数就可以了。 还有一种思路就是 + 优化。 从最暴力的角度出发,我们需要在 中维护四个变量 , 和 分别表示想左右走走的次
阅读全文
摘要:题目描述 倒垃圾 思路 其实就是思维题,题意很简单,找到一个居民左侧和右侧(如果存在的话)的垃圾桶中最近的那个垃圾桶,然后让那个垃圾桶的计数器加一。 从题目中挖掘的性质: 左侧的垃圾桶就是小于当前位置(遍历到的居民的位置)中位置最大的那个 右侧的垃圾桶就是大于当前位置中位置最小的那个。 由于题目给定
阅读全文
摘要:题目描述 环形连通分量 思路 对于一个无向图中的 简单环(环中边的数量等于点的数量),有一个很强的性质:每个点的度数等于 。 那么我们只需要先找出所有的连通块,然后判断每个连通块中的每条边的度数是否位 就可以判断该点所在连通块是不是一个简单环了。 找连通块 求连通块问题是一个图论中的经
阅读全文
摘要:题目描述 创建价值相同的连通块 思路 代码 class Solution { public: int componentValue(vector<int>& nums, vector<vector<int>>& edges) { // get max_val and sum_val int n =
阅读全文
摘要:题目描述 路径总和 思路 由于题目的范围较小,所有点的个数小于一千,因此我们可以暴力 套,以每一个节点作为根节点,然后向下遍历求每一个节点到该节点的路径和,时间复杂度为 。 但这种做法肯定会有大量重复计算,那么有没有什么办法可以消除这些重复计算呢? 我们想一下
阅读全文
摘要:题目描述 Majority Element 思路 分治法参考官方题解 其实这里的分治算法和归并排序很相像。 摩尔投票算法(同归于尽消杀法) 如果我们把出现次数大于数据长度一半的数记为 ,把其他数记为 ,将它们全部加起来,显然和大于 。 证明 “同归于尽消杀法” : 由于多数超过
阅读全文
摘要:0x00 preface 所谓 设计,并不是说,时间复杂度必须是**“总是”常数级别的。 对于一个操作来说,如果他偶尔是 的,大部分时间都是 的,并且,这个 分摊之后,我们说它的“均摊时间复杂度为 ”。** 什么是分摊?
阅读全文
摘要:0x00 模版特征 1给定我们一个整数 ,让我们在范围 之内求符合题目要求的数的个数 0x01 模版引入 1. 题目 统计特殊整数 2. 思路 首先,对于数位 的题目,解决方法就是记忆化搜索。 在明确了解决方法的前提下( + 记忆化搜索),我们开始套
阅读全文
摘要:题目描述 max min 思路 思维本质上就是一个优化的双指针,所以这里只分析双指针。 我们可以把原数组看作由被不在[minx,maxn]范围内的数分隔的多个子数组,那么问题就转换成了如何在一个子数组中不重不漏的找出所有满足要求的字数组。 方法很简单,枚举右断点就可以了。然后,如果我们希望我们的子数
阅读全文
摘要:题目描述 4706. 最短路程 思路 dfs代码 #include <iostream> #include <cstring> #include <algorithm> #include <vector> using namespace std; const int N = 100010, M =
阅读全文
摘要:题目1 子集2 思路 代码 题目2 全排列2 思路 代码 题目3 排列总和 思路 代码 题目4 排列总和2 思路 代码
阅读全文
摘要:题目描述 比较含退格的字符串 思路 这里主要考虑 O(1) 空间复杂度的做法。 一个字符是否会被删掉,只取决于该字符后面的退格符,而与该字符前面的退格符无关。因此当我们逆序地遍历字符串,就可以立即确定当前字符是否会被删掉。 只要能看出来倒序,就解决了一半了,剩下的主要是如何用代码实现。 有很多细节,
阅读全文
摘要:题目描述 三数之和 思路 参考 先不考虑重复的问题。从暴力出发,我们需要使用三重循环,会超速。 对于数组循环的优化问题,双指针很常用。 双指针(又称为快慢指针)可以将一个二重循环优化为一重,因此我们可以用双指针优化。 我们可以以此枚举每一个点作为第一个数,从后面寻找第二个和第三个数。 关于去重: 首
阅读全文
摘要:题目描述 搜索旋转排序数组 二分的过程就是归约的过程 思路来源 一个重要的性质:源数组经过旋转之后,会划分为两个递增的数组,我们假设为 和 一个清晰的思路:这道题和平常二分法查找的不同就在于,把一个有序递增的数组分成了,两个递增的数组,我们需要做的就是判断这个数在哪一个递增的
阅读全文
摘要:题目描述 最小字典许 思路 思路来源 由于t中的字符后进先出,可以使用一个暂存栈来保存s删除的第一个字符 入栈很简单,初始状态下,栈为空,我们可以直接入栈,因此,每次遍历我们都是先把元素放入栈中,然后判断是否能出栈 问题是什么时候让元素出栈 贪心的想,如果一个元素要出栈,那么s中剩下的元素不能存在比
阅读全文
摘要:题目说明 盛水最多的容器 题目要求我们找出两个边界 和 ,使得 容量: 的值最大。 思路 算法不是玄学。 首先,两层 for 循环暴力枚举所有情况肯定是对的。(不要觉得暴力是没用的,很多情况下,只有证明优化过的算法和
阅读全文
摘要:题目描述 雇佣 K 名工人的最低成本 思路 参考官方题解和这里。 代码1(正确) class Solution { public: double mincostToHireWorkers(vector<int>& quality, vector<int>& wage, int k) { int n
阅读全文
摘要:题目描述 填充每个节点的下一个节点 题目要求我们填充每个节点的 指针,让它指向它的(同一层)右侧的节点,如果没有,指向 NULL$)。 思路 看到关于二叉树的问题,首先要想到关于二叉树的一些常见遍历方式, 对于二叉树的遍历有: 前序遍历 中序遍历 后序遍
阅读全文
摘要:题目描述 三等分 思路 题目要求我们将源数组划分为三个连续的序列,即 ,使得这三个序列的二进制所表示的数相等。 首先,我们需要挖掘出一个性质:存在这样三个序列的必要条件是 的个数必须为 的整数倍。 很显然如果不能满足这个条件,是没有
阅读全文