04 2021 档案
摘要:思路: 这个题 很明显用栈来处理,但是,我有思路了,一做就错,自己写的乱乱的,理不清楚逻辑了。 首先我们需要两个栈一个用来放数字,一个用来放字符串。当我们遇到'['时,就把上次的暂存的字符串和得到的数字大小分别放入各自的栈中。如果遇到']'就开始取出栈顶的数字,并且以这个大小循环这多次,把存放字符串
阅读全文
摘要:思路: 这样的题给的值都会很大,再平方大概率会超int,那么我们在声明变量时需要long变量。 同时应该把传入的c的大小降下来,因为大于根号c的数,是不可能被使用的,所以我们从0-根号c开始找。 因为是a2+b2=c,所以我们要两次循环0-c的数,但是直接两个for循环会导致超时。 那么我们就采用双
阅读全文
摘要:思路: DFS递归即可,这里要多关注的是数字和"->"的关系。 因为我们"->"是在添加数字后加,所以我们多一个判断如果当前加入的是叶子节点,再加入val后,就把这一串字符串加入到res数组中,并return。这样就能避免最后多一个“->”。 代码: /** * Definition for a b
阅读全文
摘要:思路: 要弄清楚题目的意思,返回大小在[low,high]的数的大小的和,不是树里在这个范围里面的节点的和。 那么就是树的遍历 DFS,BFS两种完成。 因为是二叉搜索树,我们有如下几种情况: 遍历到了空节点,返回0. 该节点大于high,那么就进入该节点的左子树找更小的数。 该节点小于low,那么
阅读全文
摘要:思路: 之前做过用栈模拟队列的题,通过两个栈一个先暂存数据,判断另一个栈是否为空,不为空就暂时不添加,如果为空就从暂存的栈将元素放入该栈。 这里用队列模拟栈也是类似的,也需要两个队列来做,一个用来辅助。不过这里是栈,后加的先出,所以我们每添加一个元素,就要把用来当作栈的队列的所有元素放入另一个暂存的
阅读全文
摘要:思路: 这道题看到的时候没想到用二分法,主要问题在,关注的是如何从weight数组找结果,而不是从 全部搬完的天数 入手。 我们可以知道,要能把所有物品搬走,要花最长时间的每日搬运重量应该用的是 weights数组中 质量最大的元素,因为这样刚好确保了所有的物品都能搬走,并且花时间最长。 那么最短时
阅读全文
摘要:思路: 直接二分查找即可。 代码: class Solution { public: int searchInsert(vector<int>& nums, int target) { int n = nums.size(); int left=0,right=n-1; int res=n; whi
阅读全文
摘要:思路: 题目中描述公共祖先定义为,p,q的共同且深度最深的祖先。就是最靠近p,q的祖先节点。 那么我们应该判断每个节点的子树是否有p,q,如果一个节点都有p,q那么这个点就是公共祖先。而且我们从底向上遍历,能得到的最深的深度了。 我们 通过这个条件 (left_son&&right_son) ||
阅读全文
摘要:思路: 因为是二叉搜索树,那么就是在中序遍历的基础上进行额外的处理即可 那么就有递归和迭代两种方法。 首先递归有原地算法和非原地算法两种。 原地算法需要有一个头节点,我们从root右子树开始处理,那边处理完,头节点就能在树的开头了。 每当一个结点的right指向前一个结点后,pre就要定位在该节点上
阅读全文
摘要:思路: 一开始以为求最大深度,求下去提交发现错误。 求的是直径,意思是找到最长的一串连接的节点。但和最最大深度的方法类似,我们任然需要求出左右子树的深度,只是多了一个变量res用来存储直径长度。 对于每一个节点的最大深度,我们会求他的左右子树的深度,然后左右子树相加和res变量比较,如果大就更新re
阅读全文
摘要:思路: 对于一棵树,可以看成许多小树组成,每棵小树都有自己的root,我们从这里入手。 对于每棵小树我们都需要定位其root,对于preorder,第一个元素就是root,但inorder还需要查找,但如果每次都遍历搜索的话就会消耗很多时间,所以我们先把inorder的元素放入hash_map,元素
阅读全文
摘要:思路: 类似完全背包问题,但是背包问题求的是组合,这里求的是排列。区别为,例如{1,3},组合只有{1,3},而排列有{1,3}和{3,1}. 而组合和排列的转换可通过两个for循环,如果背包容量的for在外,物品的for在里,那么就可以得到排列。相反就得到组合的排列。 在这道题,0-target就
阅读全文
摘要:思路: 这一题比较容易想到BFS,如果我们从左到右的向队列加入节点,那么最后一个加入的节点就是我们能看到节点,那么就遍历到这层最后一个取出节点的时候就把他加入进res数组。也可以从右到左,把第一个添加进队列里面的节点放入res数组。 代码: /** * Definition for a binary
阅读全文
摘要:基础训练: 递归: 1. /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(
阅读全文
摘要:思路: 通过把二维矩阵转化为一维来求解,我们的一维并不是对矩阵处理,一维数组是一列的元素和。 首先我们定义上边界,上边界从第一行开始,然后创建一个数组,每一个上边界创建一次数组,然后再定义一个下边界,从上边界的位置开始。然后求解上下边界组成的矩阵中第0列到最后一列的每一列和。 因为矩阵还需要有左右边
阅读全文
摘要:思路: 这种每个问题元素有多个解的问题还是用动态规划。 那么我们从最后开始想,如果但用最后一个字符,那么就要保证他不为0即可。那么i位置的解码方案就应该加上前一个位置的解码方案。第一次对i位置的加,dpi是等于0的,所以此时dpi=dpi-1,转移方程就为 dpi=dpi-1; 如果用最后两个字符,
阅读全文
摘要:基础练习: 递归: /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nul
阅读全文
摘要:思路: 和昨天的每日一题相似,同样使用快慢指针,区别在于我们比较快指针所指的元素是否等于val,如果不等那么就将其放到慢指针所指的地方。最后return slow即可。 代码: class Solution { public: int removeElement(vector<int>& nums,
阅读全文
摘要:思路: hash表来做,只要res字符串的长度还小于s的长度就一直循环,循环的做的事情是先从小字母加,再从大的字母加。 我们通过vector来模拟hash表,从小到大的加就是从i=0开始加到i=25,从大到小就是25到0的加即可。 代码: class Solution { public: strin
阅读全文
摘要:思路: 直接双指针即可,也称快慢指针吧。 慢指针用来定位应该被替换的元素,也就是数组前几个元素,快指针用于发现和慢指针所指的元素不同的元素,当发现后就替换掉慢指针所指的元素即可。 代码: class Solution { public: int removeDuplicates(vector<int
阅读全文
摘要:思路: 因为固定了是在 [i-k,i+k]的区间内寻找 在区间[nums[i]-t,nums[i]+t]的元素,所以可以考虑用滑动窗口,但是这里并不用双指针来操作,不然和暴力没区别了。 我们要找到一个数据结构,能够自动排序,因为排序我们就能直接找到K窗口里面的最小值和最大值,优化找到[nums[i]
阅读全文
摘要:dbq,不会,理解不了题解。 题解 class Solution { public: bool isScramble(string s1, string s2) { if(s1.length()!=s2.length()) return false; int n=s1.length(); vecto
阅读全文
摘要:思路: 直接进行同步的DFS比较即可,首先要确定什么条件返回true,什么时候返回false 返回true即遍历到叶子节点,返回false则是某个节点值不相同,包括val不同和结构不同(即分支数和分支方向不同) 代码: /** * Definition for a binary tree node.
阅读全文
摘要:思路: 要求找离根节点最近的叶子节点,那么就DFS遍历下去,定义一个数来记录当前的节点到最近的叶子节点的距离,然后每次递归得到的距离都和这个最近距离比较,如果小就更新。 代码: /** * Definition for a binary tree node. * struct TreeNode {
阅读全文
摘要:思路: 最近发现动规很多都是从后面开始想,这题就是先考虑,第一个房子不偷和最后一个房子不偷的情况。 第一个房子不偷,就是nums[1:],最大金额是P2,最后一个房子不偷,就是nums[:n-1],最大金额是P1,那么取max(P2,P1) 对于第n个房子,如果偷了第n-1个房子,那么第n个就不偷,
阅读全文
摘要:思路: 排序后贪心 对所有nums里的元素进行排序,然后从后向前遍历,因为已经从小到大排序了,那么我们直接取最后三个数进行判断,即nums[i]<nums[i-1]+nums[i-2]是否满足,如果满足就break输出,因为是从最大的取,所以满足那一定是最大的周长,否则i-1,从倒数第二个开始,继续
阅读全文
摘要:思路: 可以用两个数组分别存奇数和偶数元素,然后再对原数组遍历,当下标为奇数就从存放奇数的数组拿出一个,当下标为偶数时就从偶数的数组拿出一个。 时间复杂度O(n),空间复杂度O(n) 另一个是原地算法,用两个指针,一个检测奇数位是否有偶数,另一个检测偶数位是否有奇数。 首先先用检测偶数位的指针遍历,
阅读全文
摘要:第一次见到前缀树这个词,就先认识一下吧。 该题题目说:Trie(发音类似 "try")或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。 既然是存储字符串,那么一个父亲节点应该有26个子节点。因为保存一个字符串还需要有
阅读全文
摘要:思路: 是二叉搜索树,那么就中序遍历吧,这样就能不用求绝对值。 需要写一个void函数,如果用原函数要返回int,会影响取最小值,且传入参数要用引用。 我们定义一个存储当前最小值res和上一个节点的值的变量pre,分别初始化为INT_MAX和-1. 然后传入root,res,pre,首先判断pre是
阅读全文
摘要:思路: 我们需要一个指向已排序链表的最后一个元素的指针lastsort,一个cur指针指向当前用来排序的元素。为了避免head被改变导致错误,还需要一个dummy指针指向head。 首先lastsort指向head,cur指向head->next。然后遍历链表,判断lastsort是否小于cur,如
阅读全文
摘要:思路: 这道题就需要对比没对数,ab和ba谁更大。那么我们就把nums的元素都放入vector里面,这样string类型利于a+b和b+a的合并。 然后通过调用sort函数根据函数a+b>b+a的lambda函数排序。 然后判断排序后的数组第一个元素是否为0,为0就return 0,否则就加入一个s
阅读全文
摘要:思路: hash_map存入一个数组的元素并计数,然后再遍历另一个数组如果hash_map存在这个元素,并且还没被减到0,那么就添加进res结果数组中并将hash_map计数减一。 代码: class Solution { public: vector<int> intersect(vector<i
阅读全文
摘要:思路: 题目给的是升序且无重叠的区间,那么我们通过遍历,不断加入数组进res结果数组里面,直到intervals[i][1]>newinterval[0]就停下。 这时在从这个i开始向后遍历,判断intervals[i][0]是否小于等于newintervals[1],如果满足,说明还存在重叠区间,
阅读全文
摘要:思路: 可以用hash_map存放一个string的元素并计数有几个,再遍历另一个string,查看hash_map有没有并且遍历到的这个字母的数量还有没有大于0,这样就能判断有没有相同和不同的字符并且数量相不相同了。 代码: class Solution { public: bool isAnag
阅读全文
摘要:思路: 可以通过计数0,1,2的个数,然后按照个数直接个nums重新赋值覆盖原来的值即可。 class Solution { public: void sortColors(vector<int>& nums) { int n=nums.size(); if(n==1) return; int n0
阅读全文
摘要:思路: 因为数组中可能有重叠的部分,而重叠的要求是 [L1,R1]和[L2,R2]相比 L2<=R1那么这两个数组就重叠。根据这个性质,我们能得到判断条件 如果R1<L2,那么我们就不用处理重叠,否则我们就需要取R1=max(R1,R2)。为什么是R1等于呢?因为我们默认[L1,R1]在存放结果的数
阅读全文
摘要:思路: 如果一个数为丑数,那么自然会被2,3,5整除,最后得到1,那么我们一直循环判断n是否能被2,3,5其中一个整除,如果能 那么n=n/(2 or 3 or 5)。如果三个数都不能整除那么就返回false。如果循环结束还没有返回false,那么就直接返回true。 代码: class Solut
阅读全文
摘要:思路: 首先是子序列,所以说并不一定要求是连续的序列满足摆动序列。同时题目要求的是最长摆动子序列的长度。 动态规划 那么我们可以考虑通过记录摆动的长度得到,什么是摆动的长度呢?我们可以用up和down两个变量来记录摆动的次数,如果前一个差为正数,当前差为负,那么就是遇到了一个down,模拟往下摆动。
阅读全文
摘要:思路: 这道题需要找规律了,因为题目是求有多少种方案获得平衡数组,那么就需要遍历所有元素。 首先 对于删除元素的左侧是可以发现不受影响的,但删除元素的右侧元素下标会-1,整体向左侧移动一个单位,那么原来在奇数位置的元素就会变到偶数位。所以我们只需要得到右侧的元素的和即可。 我们定义 int left
阅读全文
摘要:思路: 这道题虽然是困难,但和昨天的每日一题没区别,可以用二分秒了。 同样是利用二分的二段性,因为有重复的元素,所以找旋转点的时候去掉重复的元素,恢复二段性,然后剩下的就和昨天的代码一样了。 这个二段性真的理解太好用了,强烈推荐好好看看。 代码: class Solution { public: i
阅读全文
摘要:思路: 直接用大顶堆,每次取两个数来比较即可,难点是循环的条件为什么。 考虑两种情况,最后堆只有一个元素,那么就返回这个元素值,最后堆没有元素,为什么呢,因为我们每次去两个数,如果倒数第二步还剩下两个石头,且相同重量,那么最后就没有元素了。针对这两种情况都是堆的元素数量>1,因为最后结果只有1和0嘛
阅读全文
摘要:思路: 这道题有个要求就是(A)的得分要乘2,那这就有个问题了,如何记录一个括号之间有多少分呢,又该如何记录以前的分数,并能区分不是一个括号里面的之前算出来的分数。 又因为我们可能回下意识的把栈定义为char类型把'('放入栈里,这样就没思路了。 考虑题目说给的string一定是平衡括号对,所以我们
阅读全文
摘要:思路: 刚开始看到这题,没能准确理解意思,直接用两个指针分别从pushed的第一个元素开始往后,从popped最后一个元素向前,然后比较,不相等就return false,然后错误,对比了一下例子发现 pushed=[1,2,3,4,5],popped=[4,5,3,2,1]而不是[5,4,3,2,
阅读全文
摘要:思路: 这个题目描述的就很迷,是看了讨论才明白在问什么。 题目说是包含所有不同字符的最小子序列, 所有不同字符说明 s字符串中所有出现过的字符都要有,最小说明满足前一个条件后,子序列要尽量让小字符排在前面,如ab和ba,那ab就是更小的。子序列,说明要是例子里面的子序列,如"cbacdcbc",输出
阅读全文
摘要:思路: 这种旋转数组的题,首先要确定一个旋转点。可以用二分法来寻找。 因为有特例,当旋转n次时,数组就还原了,这就不满足二分法的 二段性,这支博客解释过,所以我们要特别把这种情况单独考虑。然后其余的情况都可以用二分法找到旋转点,根据自己寻找的旋转点的细节来判断时right还是位与right+1的位置
阅读全文
摘要:setup.s模块:完成OS启动前的设置,为操作系统管理硬件做准备。 例如: 读内存大小并保存起来,操作系统要管理内存得知道他多大。 获取光标的位置,显卡参数,根设备号等信息后,操作系统会形成很多数据结构来管理这些设备,来形成表来管理内存,这时候就是操作系统开始接管硬件。 后面会将操作系统移动到0地
阅读全文
摘要:思路: ###堆 这个题也可以用堆来做,和题313. Super Ugly Number的 堆做法一样。 通过大顶堆,即降序的堆来存放每个数,初始化res为1,因为这里的丑数的质因数只能是数组primes里面的,所以只要将2,3,5改为primes里的数即可。 在判断堆里是否有重复的元素,有则pop
阅读全文
摘要:思路: 和692.Top K words题目是相同的,一样的用hash map对出现的次数进行计数,然后最后再以pair的形式放如堆中,以出现次数为主要排序对象,用默认大顶堆即降序排序即可。 代码: class Solution { public: vector<int> topKFrequent(
阅读全文
摘要:思路: 因为还要考虑到字母顺序,所以肯定能用堆来存储。这里还需要先计数每个单词出现的次数,可以考虑用hash map来计数,再以pair的类型存放进堆,因为这里堆用大顶堆即降序排序,我们对出现次数取负值即可,然后每次加入进堆都判断一次是否数量大于K了,如果大于就pop掉堆顶元素,因为降序所以出现次数
阅读全文
摘要:仅供自己学习 思路: ###暴力 刚开始看确实没思路,用的暴力法。因为他要的数是质因数只为2,3,5的。那么我们只需要获得通过2,3,5相乘得到的数即可。通过三个循环,先a=a2,然后b=a,b=b3,最后c=b,c=c5,这样得到的c就是是由23*5得到的数,但是这样得到的数,没法确定大小关系,所
阅读全文
摘要:仅供自己学习 思路: 思路比较简单,但要注意细节处理。 一开始就是想遍历寻找nums[i]<nums[i-1]获得旋转点,然后对这两侧的数组分别使用二分搜索,但是一直报错,找不到原因。 根据题解二分可知二分的本质是二段性,而非单调性。只要一段满足某个性质,另外一段不满足这个性质就可以用二分。 对于一
阅读全文
摘要:仅供自己学习 思路: 题目要求原地算法,在考虑因为最大有两个重复元素。那么我们运用双指针,一个用来记录遍历过且修改为不重复的数组长度slow,一个用来记录当前位置的fast指针。这个问题容易找到超过两个元素的重复元素,但是如何去掉是个问题。 因为我们允许重复两个,那么我们每次判断都是slow-2的元
阅读全文
摘要:仅供自己学习 思路: 因为num1的空间能容纳num1和num2的内容,所以第一种方法就是可以把num2的数全加进num1中然后在sort即可。 相当于调用快排时间复杂度为O((m+n)log(m+n)),空间复杂度O(1) 第二种方法是创建一个数组,然后比较num1和num2的大小放入新数组,最后
阅读全文
摘要:仅供自己学习 思路: 需要定义两个栈st1,st2.第一次调用CQueue()时,可以用于清空两个栈。加入元素的函数直接加入进st1即可,对于删除函数,要先判断st2是否为空,如果不为空直接从st2弹出元素,如果为空就从st1一直加元素直到st1为空,如果st1为空,st2没有元素加进去,那么就返回
阅读全文
摘要:仅供自己学习 思路: 新建一个数组,用left和right两个指针,判断nums[i]是否为偶,如果是就res[right]=nums[i],否则从left位置加。 代码: class Solution { public: vector<int> exchange(vector<int>& nums
阅读全文
摘要:仅供自己学习 思路: 题目要求最小的颜色种类,这里要从相同数字入手。因为相同数字有两种可能,第一种是多个同种颜色的兔子在说他们这种颜色的有多少只,另一种是不同种颜色有相同的数量,这是解决问题的关键点。 我们需要进行统计找规律。[2,2,2],那么最少种类的可能就是只有一种颜色,数量为3,所有兔子都被
阅读全文
摘要:仅供自己学习 思路: 这种题应该用动态规划,因为上到n台阶的方案需要分成不同种方案,即上一层和上两层的多种组合。 首先考虑上到最后一层,可以有上一层台阶到达最后一层,也可以有上两层台阶到达最后一层,那么总的方法就有 dp[n]=dp[n-1]+dp[n-2]种。 因为题目给的范围不为0,所以dp[0
阅读全文
摘要:仅供自己学习 思路: 直接遍历判断即可 class Solution { public: int calculate(string s) { int n=s.length(); int x=1,y=0; for(int i=0;i<n;++i){ if(s[i]=='A') x = 2*x+y; e
阅读全文
摘要:仅供自己学习 思路: 按照题目要求我们需要定义一个head头节点,并且因为树是二叉搜索树,所以要采取中序遍历才能得到从小到大的排序。 按照中序遍历的模板 dfs(root->left); cout<<root->val; dfs(root->right); 同样我们也通过这个模板写DFS,这里因为是
阅读全文
摘要:仅供自己学习 思路: 因为这是求公共子序列,不是公共子字串,所以公共的元素可以不连续,那么暴力为每个字符找相同的字符就需要O(n^2)的时间。 考虑用两个string的长度做二维矩阵,用动态规划。定义dp[i][j]为text1长度为i,text2长度为j是的公共子序列长度,text[0:i]定义为
阅读全文
摘要:仅供自己学习 思路: 我们通过DFS递归把所有的分支到叶子节点的都计算看是不是满足这个目标值。 首先判断递归传入的root是否是NULL,如果是就返回,不是就把这个sum-root->val,然后加入进path中去,如果 sum=0说明这条路是满足了target,那么久加入进res中,加入后不直接r
阅读全文
摘要:仅供自己学习 思路: 因为要求接水的最大单位数,那么需要知道两侧的的高度。但如果遍历每一个位置再向两侧展开会很绕,需要很多if条件。如果我们从两侧向中间靠近则会容易理解得多。我们设置两个指针left和right,left指向第一个位置,right指向最后一个位置,在定义leftmax和rightma
阅读全文
摘要:仅供自己学习 思路: 思路比较简单,就是遍历整个矩阵,查找与word第一个字母相同的元素,然后搜寻他的上下左右的元素是否等于word的下一个元素,如果有一个方向有就从这个方向继续上述步骤。否则将会退出这个元素,从矩阵的下一个元素开始判断。实现的方法就是DFS回溯法。 我们当我们找到word相同元素的
阅读全文
摘要:仅供自己学习 思路: 自顶向下: 可以递归到最低层开始计算层数,当root为NULL时,就返回0,说明是最底一层。然后到上一个递归,因为上一个递归的root不为空,那么我们就return 左右子树中的最大层数+1,那么倒数第二层就是0+1,如此就能得到一个子树的最大深度了。这就是递归函数的内容,即获
阅读全文
摘要:仅供自己学习 思路: 因为这个是有一定规律的使用运算符,那么就存在一定周期,所以我们就可以考虑一个数conut通过模这个周期来判断此时可以用哪个运算符。又因为这是滞后计算,那么就用栈。 我们从N这个数往0减小,我们可以知道从第一个数 相乘到加上最后一个数,总共有4个数,那周期就为4.首先对于相乘的数
阅读全文

浙公网安备 33010602011771号