08 2021 档案
将数据流变为多个不想交区间
摘要:变量简洁正确完整思路 map<int左边界,int右边界>left2right map<Int右边界,int左边界>right2left 可以利用右边界查找左边界,可以利用左边界查找右边界 对于num,查找num-1作为右边界的左边界和num+1作为左边界的右边界 如果都有,新的左边界right2l
阅读全文
摆动排序II
摘要:变量简洁正确完整思路 快速选择找到中点n-1)/2的值midNum 找到中点midNum后,用三分法将<放左边,=放中间,>放右边, 00 111 56 i从mid往左,j从n-1往左,才能1这个重复的放在最两侧 不能i从0往右,j从mid+1往右,不能保障1这个重复的在最左边 三分法1232222
阅读全文
拼接最大数
摘要:[image:1628696379919.png] 变量简洁正确完整思路 单调栈能够在保证相对顺序下,找到一个最大的组合,因为遇到更大的只要pop掉 前面较小的这就是单调栈,但是对长度有限制导致后半部分不用考虑pop不单调, 合并nums1nums2只需要大的放前面,但是相等,因为不是单调,所以需要
阅读全文
最大单词长度乘积
摘要:变量简洁正确完整思路 枚举两个单词,wordsi wordsj 如果没有重复单词就更新答案ans,判断重复用哈希集 seen遍历wordsi,然后遍历wordsj看是否存在 class Solution { public: int maxProduct(vector<string>& words)
阅读全文
去除重复字母
摘要:变量简洁正确完整思路 去重用哈希集,相对顺序就像按顺序放到双端队列deq,字典序最小如bcabc 有bca和abc,遇到a,如果后面还有bc(用char2cnt表示a后面还有多少),且deqfront>a就应该popdeq并删掉哈希集,如何维护char2cnt,先遍历一遍全部,然后 b就cnt--,
阅读全文
最小高度树
摘要:变量简洁正确完整思路 拓扑排序,删除前的图A是,删除入度为1的节点后的图B,A的最小生成树是B的最小生成树叶子接上删除的节点, 无向图拓扑排序,入度至少为1,初始化graph需要edges[i][0] edges[i][1]都初始化为彼此,都要更新入度,topoSort把入度1都放入que,然后一次
阅读全文
累加数
摘要:变量简洁正确完整思路 dfs,全局ok判断 fori作为第二个开头,forj作为第二个结尾,计算后从k=j+1开始找, <add就继续找,=add dfs,>addreturn,以下是未处理溢出的初步代码,防止前置0用了很多continue class Solution { public: bool
阅读全文
最长递增子序列
摘要:变量简洁正确完整思路 dp,dpi是0到i的以numi为结尾的最长严格递增长度,dp0时第一个 转移 10 9 2 5 3 7 101 18 dp i=max(dpj +1)dp i if numj<numi 初始化 dp 初始化1,至少都是1 class Solution { public: in
阅读全文
二叉树的序列化和反序列化
摘要:变量简洁正确完整思路 本质上是前序遍历过程记录,不同是遇到空节点也要记录,所以可以光靠同样一个前序遍历恢复 dfs,形参root将root序列化成字符串,前序遍历也就是root->val+ +左子树+ +右子树,边界返回null,利用stringstream很好处理空格的特性,用空格来分割 dfs,
阅读全文
数据流的中位数
摘要:插入排序,往已经排好序的插入一个元素就用插入排序 class MedianFinder { public: vector<int>nums; /** initialize your data structure here. */ MedianFinder() { } void addNum(int
阅读全文
单词规律
摘要:变量简洁正确完整思路 a->dog b->cat, jk找到str 如果c已经有但str不一样false 如果str已经有但c不一样false 更新两个哈希表 class Solution { public: bool wordPattern(string pattern, string s) {
阅读全文
生命游戏
摘要:变量简洁正确完整思路 如果是1,123规则,如果是0,4规则,赋值tmp,遍历原数组每个元素,if1if0,用tmp 判断8个方向,dxdy,cnt计算八个方向活细胞 class Solution { public: void gameOfLife(vector<vector<int>>& boar
阅读全文
为运算符表达式设计优先级
摘要:变量简洁正确完整思路 需要所有答案用 dfs获得数组,可以计算出s的所有可能值的数组,fori si=+-*则调用dfs dfs算出+-*两端s的值的数组vec1vec2,for vec1forvec2根据+-*更新ans,如果没有+-*也要返回本身,有的话 返回ans class Solution
阅读全文
滑动窗口最大值
摘要:变量简洁正确完整思路 窗口只需要最大值,用priority_queue num2index 先放前k个{num, i}再更新答案 再每push一个就只要num2index.top().second<=i-k就q.pop直到最大值在窗口i-k内,更新答案,窗口逻辑左边界i-k+1,如果top在左边界右
阅读全文
回文链表
摘要:变量简洁正确完整思路 快慢找到中点,翻转,同时比较,恢复 class Solution { public: bool isPalindrome(ListNode* head) { if(!head->next)return true; ListNode*S=head,*F=head; while(F
阅读全文
数字1的个数
摘要:变量简洁正确完整思路 遍历1-n,toString,count’1‘ class Solution { public: int countDigitOne(int n) { int ans=0; for(int i=1;i<=n;i++){ string tmp=to_string(i); ans+
阅读全文
求众数II
摘要:摩尔投票法,选出至多m个代表 变量简洁正确完整思路 对于num,找到对应的候选人cands[i],cnts[i]++,如果num找不到cands[i],从cnt[j]找到cnt[j]==0的进行取代,如果找不到cnt[j]==0的,对cnts[j]所有--,计数时,对cands的候选人计数,先can
阅读全文
基本计算器
摘要:变量简洁正确完整思路 逆波兰表达式1+(2-3*4)/5+6 添加括号 (((1+((2-(3*4))/5))+6) 将符号移动到外一层右边(((1((2(3 4)*)-5)/)+6)+ 去掉括号1 2 3 4 * - 5 / + 6 + 处理转化逆波兰表达式 数据栈ans,符号栈flags,遇到从
阅读全文
完全二叉树的节点个数
摘要:变量简洁正确完整思路 dfs,形参root,计算出完全二叉树root的节点数,只要算出左右子树的节点数,+1就行了,空节点提前返回0,但是对于root树,root最后一层的最后一个root存在,则可以利用公式return 1<<height-1,因此对于root树是满的应利用公式,判断方法是left
阅读全文
最大正方形
摘要:变量简洁正确完整思路 精确定义 dpij 右下角ij的全是1的正方形边长最大值,dp00是空dp11是第一个 转移 0 1 1 1 0 1 1 1 1 0 0 1 1 1 1 0 0 0 1 1 if num = 1 dp ij=min dpi-1 j dp i j-1 dp i-1 j-1 +1
阅读全文
存在重复元素III
摘要:变量简洁正确完整思路 滑动窗口leftright,长度k,对于新的元素num1可以遍历窗口内部,如果滑动窗口用set或map存放就有序,调用lower_bound(num1-t)找到第一个大于等于num1-t的迭代器it,找到且*it<=num1+t则true,否则num1放进串口right++ 精
阅读全文
数组中的第K个最大元素
摘要:变量简洁正确完整思路 快速排序,dfs形参begend,将begend数组排序完毕,基准数nums[beg],左右哨兵ij,j向中间找到小于nums[beg]的数,i向中间找到大于nums[beg]的数,交换ij,ij继续向中间找,直到i==j交换nums[beg],nums[i],这样基准数处理完
阅读全文
打家劫舍II
摘要:变量简洁正确完整思路 要么不要第一家,要么不要最后一家, 精确定义 dpi 到第i家,最高金额,dp0是第一家 转移 1 2 3 1 dp i=maxdp i-1 dpi-2 +val 初始化 dp 0=0 dp 1=val dp 2=max val val 踩过的坑 vector<int>dp(n
阅读全文
单词搜索II
摘要:变量简洁正确完整思路 暴力dfs,分为dfs开头判断和dfs入口判断两种方法,目前来看都可以,而且没有什么区别,但是第一种更加像递归,用第一种,还有注意第一种for循环前后要vis、ans1 但是第一种有一个严重的问题,想要回溯vis很容易,for前后就行,但是想要回溯 ans1就非常麻烦,你不能用
阅读全文
添加和搜索单词-数据结构设计
摘要:变量简洁正确完整思路 字典树,查找用dfs,形参beg,word,root,判断root树是否有beg为开始下标的word,如果root树为空边界返回false,如果beg==n则边界返回root->isEnd,最后返回,如果是。则26个只要有一个dfs得出root->next树有以beg+1的就是
阅读全文
长度最小的子数组
摘要:变量简洁正确完整思路 滑动窗口,leftright是第一个最后一个,元素和add维持target,小于,right++add+= 大于等于更新ans,left++add-= class Solution { public: int minSubArrayLen(int target, vector<
阅读全文
实现Trie(前缀树)
摘要:变量简洁正确完整思路 Tires,isend和Tires*next[26] class Trie { public: Trie() { isEnd=false; memset(next,0,sizeof(next)); } void insert(string word) { Trie*node=t
阅读全文
课程表
摘要:变量简洁正确完整思路 拓扑排序,图edges前置节点对应当前节点,入度indegrees节点对应入度,topoSort形参n寻找n个节点组成拓扑排序,que存储入度为0的节点 class Solution { public: vector<int> findOrder(int numCourses,
阅读全文
计数质数 埃氏筛
摘要:变量简洁正确完整思路 埃氏筛,isPrime[]表示1是质数0不是,遍历2到n,if i是质数ans++且所有 2i 3i ii i i-1 小于n的倍数isPrime=0,如果有i不是质数且没有被=0过是不可能的,比如10 9 25 4 27等都在前面被他们的因数=0过,4 6 8等也在之前被=0
阅读全文
打家劫舍
摘要:变量间接正确完整思路 精确定义 dpi 到第i家最多钱,dp0表示空,dp1表示第一家 转移 2 7 9 3 1 dp i=maxdp i-1 dpi-2+val 初始化 dp0 =0 dp1=nums[0] class Solution { public: int rob(vector<int>&
阅读全文
最大数
摘要:变量简洁正确完整思路 模拟一下,对于const int&a,const int&b return ab>ba, 对于2342 231 2342*1000+231 >231*10000+2342 class Solution { public: string largestNumber(vector<
阅读全文
地下城游戏
摘要:变量简洁正确完整思路 动态规划dpij,左上到右下既需要路径和大,还需要初始生命值小,不满足无后效性,右下到左上,只需关心从ij到n-1m-1 ij需要的最小生命值 精确定义 dpij 从ij到n-1m-1需要的最小初始生命值,dp00是第一个格子,dpn-1n-1是右下 转移 -2 -3 3 -5
阅读全文
阶乘后的零
摘要:变量简洁正确完整思路 有多少个0-》2比5多-》有多少个5? 1-24直接+=n/5 25有多少个5?(n)/5+(n)/25 125 625。。。 但是不会超过n,所以如果n在125-625之内 先+=n/5,再+=n/25在+=n/125 也即是+=n/5 +=n/5 /5 +=n/5 /5 /
阅读全文
多数元素
摘要:变量简洁正确完整思路 随机找一个数0-n-1的下标i,计数nums[i]是否超过一半 class Solution { public: int majorityElement(vector<int>& nums) { while(1){ int i=rand()%nums.size(); int c
阅读全文
十大排序算法实现 C++
摘要:变量简洁正确完整思路 排序,遍历数组nums更新差值答案ans class Solution { public: int maximumGap(vector<int>& nums) { int n=nums.size(); sort(nums.begin(),nums.end()); int ans
阅读全文
比较版本号
摘要:变量简洁正确完整思路 cur1cur2同时遍历,两人版本号值为num1num2=0,只要没到.就num1=num1*10+ s[cur1]-'0',cur++,如果cur1或cur2到n1或n2则num1或num2就是0,while中 一旦num1num2不同立刻返回 精确定义 cur1cur2 n
阅读全文
相交链表
摘要:变量简洁正确完整思路 cur1cur2指向headAheadB,同步走,一般,有相交,则cur1cur2一个到尾了一个还没有到,此时,到尾的去另一条链,继续同步,后来到尾的也去另一条链,则第二遍必定在交点相遇,因为第一遍,前部分未相交的一条如果多走了一步,则第二遍那条在交点处必定少走了一步,刚刚好
阅读全文
最小栈
摘要:变量简洁正确完整思路 一个栈stk和一个同步最小栈minStk,当pushstk,val与minStktop比较,较小的push进minStk,当popstk,popminStk,当top时,返回stktop,当getMin时返回minStktop,另外一个思路是只用一个stk,元素是pair<in
阅读全文
寻找旋转排序数组中的最小值
摘要:变量简洁正确完整思路 二分,leftright,对于mid,如果[left]<[mid]则左边是升序,则更新ans=min[left],排除左半段,同理[mid]<[right]则右边升序,则ans=min[mid]更新,排除右半段 精确定义 left mid right class Solutio
阅读全文
乘积最大子数组
摘要:变量简洁正确完整思路 具有某种递推关系dpi,因为遇到负数则前面越小越好,所以维护dp2 i,遇到正数,则前面的越大越好,不要麻烦的ifelse,直接维护dp和dp2,一个最大一个最小 精确定义 dp i 第i个元素结尾连续数组最大乘积,dp0是空,dp1是第一个 dp2 i 第i个元素结尾连续数组
阅读全文
翻转字符串里的单词
摘要:变量简洁正确完整思路 left来到一个字符,right来到最后一个字符,如果s[left]不是空格就word+=s[left],遇到空格将单词push_back到双端队列deque ans1,string ans从ans1前部取单词+=并加空格,ans1空了就不要加空格 精确定义 left righ
阅读全文
逆波兰表达式求值
摘要:变量简洁正确完整思路 4 + 13 / 5,这就是中缀表达式,计算机从左到右去扫描的话,扫到13,还要判断13后面是什么运算法,还要比较一下优先级,然后13还和后面的5做运算,做完运算之后,还要向前回退到 4 的位置,继续做加法 转化为后缀表达式之后:["4", "13", "5", "/", "+
阅读全文
排序链表
摘要:变量简洁正确完整思路 找中点分成两个子链表,对两个子链表排序,合并两个有序链表,dfs形参head得到head链表的有序链表,head为空或head->next为空边界返回,再对dfs返回两个有序链表进行合并, 画图 [image:1628080189374.png][image:162808020
阅读全文
对链表进行插入排序
摘要:变量简洁正确完整思路 画图,链表题画图,原始变量中间变量修改指针修改原始变量,一般开头和结尾容易错,修改指针容易错,原始变量越少越好这道题是ok,中间变量多一点i、pre、cur、nex,结尾的修改指针也很重要 class Solution { public: ListNode* insertion
阅读全文
LRU缓存机制
摘要:变量简洁正确完整思路 哈希表key2node,双向队列cache存放pair, 对于put,如果key在key2ndoe中提前删除,如果cache等于最大容量maxCapacity提前删除key2node中的cache最后一个和删除cache最后一个,更新cache和key2node,{key,no
阅读全文
环形链表II
摘要:变量简洁正确完整思路 slow每次走一步fast每次走两步,相遇,ans从起点,和slow同时走,相遇,返回相遇点 画图 class Solution { public: ListNode *detectCycle(ListNode *head) { ListNode*L=head,*R=head;
阅读全文
单词拆分II
摘要:变量简洁正确完整思路 一个问题所有具体解用dfs,dfs形参len对字符串进行如图dfs,len==0更新答案ans,dfs常用参数len,逆向枚举分割点i,如果后半段substr在dict中且前半段满足dpi,则加入答案ans1前端(ans1用deque)并dfs枚举前端,或者不要 精确定义 dp
阅读全文
单词拆分
摘要:变量简洁正确完整思路 dpi具有某种递推关系, 精确定义 dp i 0到i的字符串能否用dict表示,dp0是空,dp1是第一个字符 转移 - - a b c if s[j..i]在dict中某一个字符串并且dpj=1则dpi=1,且不用继续找dpj 查找方法,将dict放入哈希集dict中进行查找
阅读全文
复制带随机指针的链表
摘要:A 遍历简洁正确完整思路 dfs,形参head,得到拷贝的head链表,headClone哈希表存放head链表对应拷贝head链表,if head空边界返回,if headClone有拷贝的head链表提前返回,否则,new head的拷贝节点放进headClone,再dfs求head->next
阅读全文
只出现一次的数字
摘要:变量简洁正确完整思路 哈希表numToCnt,对于每个数nums[i]保存进numToCnt,遍历numToCnt,if it->second==1 return it->first 精确定义 class Solution { public: int singleNumber(vector<int>
阅读全文
只出现一次的数字
摘要:变量简洁正确完整思路 [image:1627984156193.png] 和自身异或为0,和0异或为自身,满足交换律结合律 把所有num异或,出现2次的交换结合率后为0不影响其他num,最后只剩出现一次的 精确定义 ans初始化为第一个数字,然后和其余数字异或 class Solution { pu
阅读全文
分发糖果
摘要:变量简洁正确完整思路 正向,第i人如果ratings[i]>tatings[i-1]则need[i]=need[i-1]+1否则need[i]=1,算出正向需要的每个人最少谈过,再逆向,如果ratings[i]>ratings[i+1]则needi=needi+1否则=1,然后needi和need[
阅读全文
加油站
摘要:详细思路 从i开始,往右找j最远,如果j绕了一圈,return,如果j不能到达按个点,i从那个点开始判断,如果那个点是绕了一圈到原点或原点以后,没必要继续从那个点开始判断,说明return-1 精确定义 i这个点作为起点 j需要判断能否到达,从i+1开始判断 sumGas从i作为起点,到达j之前的汽
阅读全文
分割回文串II
摘要:详细思路 具有某种递推关系 精确定义 fi 0到i最少分割次数,只需要往前面找fj,j到i是回文串,则fi=fj+1,f0是第一个字符 i下标,最后一个 j下标,最后一个,j+1到i是否为回文 转移 - - - - a b a f i =f j+1 如果s[j+1,i]回文串 初始化 f 0=0本身
阅读全文
分割回文串
摘要:详细思路 因为需要找到所有的子串,一般dfs,dfs找到每一个子串,形参i为子串起点,枚举终点,如果子串是回文串就更新答案,或者不要这个子串,判断子串是否为回文串用动态规划dpij,i起点j终点 精确定义 dpij i到j是否为回文串,dpii是长度为1的字符串,dpi i-1是空字符串 i需要判断
阅读全文
求根结点到叶节点数字之和
摘要:详细思路 dfs,遍历一遍,在过程中积累路径和,到根结点更新答案 详细思路 dfs,仅仅只是遍历,ans,ans1仅仅只是携带数据,和递归逻辑无关 ans1遍历中积累路径和 ans根结点积累ans1,全局唯一所以用& class Solution { public: int sumNumbers(T
阅读全文
最长连续序列
摘要:详细思路 哈希集伪排序,枚举哈希集每个数num,如果num-1已经在哈希集,说明已经尝试过了continue,否则,从这个数开始,不断查看num+1在不在,在更新答案num++, 精确定义 hashNums哈希集数字 num已经考虑 ans1 ans class Solution { public:
阅读全文
单词接龙II
摘要:详细思路 每一层,从curArr最后一个字符串变化一下后(用回溯),如果在dict就curArr并放进容器(用回溯),直到变化后是endWord,遍历层序遍历遍历容器,容器里面是每一层的字符串数组,fori--取出当前层的字符串数组curArr,记录curArr最后一个字符串为tail,如果tail
阅读全文
验证回文串
摘要:详细思路 双指针,向中间,都一步如果不是那些再补上一步,判断 精确定义 left需要 right需要 class Solution { public: bool isPalindrome(string s) { int n=s.size(); int left=0,right=n-1; while(
阅读全文
二叉树中的最大路径和
摘要:详细思路 dfs1,求出以root为顶点的链表的最大路径和,只需要dfs遍历一遍,每一次都调用dfs1求出以root为顶点的树的最大路径和,更新最大的答案就行了,那么dfs1怎么求呢?以左孩子和右孩子为顶点的链表的最大路径和较大的+root->val,当然如果小于等于0不算入 精确定义 dfs,形参
阅读全文
买卖股票的最佳时机III
摘要:详细思路 具有某种递归关系,最多进行几笔用第三维,不可能作为边界的初始化为-0x3f3f3f3f,k次数超过一半就是无数次交易的函数 精确定义 dpijt 第i天0代表还没开始1代表第1天,0无股票1有股票,正在处理第t笔交易,t=0代表最多买入0次,t=1代表最多买入一次 转移 3 3 5 0 0
阅读全文
买卖股票的最佳时机II
摘要:详细思路 具有某种转移 精确定义 dpij 第i天0无股票1有股票的最大利润,dp0是空dp1是第一天 转移 7 1 5 3 6 4 dp i 0=max(dp i-1 0,dp i-1 1 +val) dp i 1=max(dp i-1 1,dp i-1 0 -val) 初始化 dp0 0=0;d
阅读全文
买卖股票的最佳时机
摘要:详细思路 只能买一次 精确定义 dpi j第i天,0无股票1有股票,利润最大,dp0是空,dp1是第一天 转移 7 1 5 3 6 4 dp i 0=max(dp i-1 0, dp i-1 1 +val ) dpi 1=max(dpi-1 1, -val) 初始化 踩过的坑 只能买一次,所以dpi
阅读全文
三角形最小路径和
摘要:详细思路 具有某种递推关系,如果可以的话直接在原三角形上修改,问面试官 精确定义 dpij 从最底层到达下标ij的最小值,dpn-1 n-1是最底层dp00是第一层 转移 2 3 4 6 5 7 4 1 8 3 dpij=val+min(dpi+1 j, dp i+1 j+1) 初始化 dp n-1
阅读全文
杨辉三角II
摘要:详细思路 滚动数组,保存上一次数组,生成本次数组,上一次数组初始化为空,如果上一次数组不是空就计算,最后pre=cur数组,继续计算当前数组 class Solution { public: vector<int> getRow(int rowIndex) { vector<int>pre; vec
阅读全文
杨辉三角
摘要:详细思路 压成等腰直角,遍历每一行,当前值为左上和上的和 class Solution { public: vector<vector<int>> generate(int numRows) { vector<vector<int>>ans(numRows); for(int i=0;i<numRo
阅读全文
填充每个节点的下一个右侧节点指针
摘要:详细思路 本想递归,能力不足,这道题更适合层序遍历,在第i层遍历已经建好的next节点,为下一层建立next节点,然后进入下一层继续, 精确定义 beg为每一次头结点 i为遍历当前节点,需要处理 newBeg新的头结点,在合适和地方赋值,如果为空,最好是第一个i->left pre i的前一个节点,
阅读全文
填充每个节点的下一个右侧节点指针
摘要:详细思路 dfs,六星图,参数root,将整棵树next完毕,当左右子树都next完毕,六星图,我只需要把左子树的最右指向右子树的最左 精确定义 dfs,参数root把root树next完毕,为空提前返回。没有23或者56提前返回 class Solution { public: Node* con
阅读全文
不同的子序列
摘要:详细思路 dpij具有某种递推关系 精确定义 dpij s前i个和t前j个,t的前j个在s的前i个有多少种方案,dp00是空字符,dp11是第一个 转移 - - - a - - a dpij=dpi-1 j不适用这个a来匹配下面的a,方案数取决于前面 + dpi-1 j-1使用a来匹配a,方案数取决
阅读全文
二叉树展开为链表
摘要:详细思路 前序遍历得到数组,对于数组内每一个节点,左子树为nullptr,右子树为下一个节点 精确定义 nodes前序遍历节点 class Solution { public: void flatten(TreeNode* root) { if(!root)return ; vector<TreeN
阅读全文
二叉树展开为链表
摘要:详细思路 前序遍历得到数组,对于数组内每一个节点,左子树为nullptr,右子树为下一个节点 精确定义 nodes前序遍历节点 class Solution { public: void flatten(TreeNode* root) { if(!root)return ; vector<TreeN
阅读全文
前序遍历
摘要:详细思路 六星图 class Solution { public: vector<int> preorderTraversal(TreeNode* root) { vector<int>ans; stack<TreeNode*>stk; while(!stk.empty()||root){ whil
阅读全文
路径总和II
摘要:详细思路 dfs,形参roottargetSum,得到root树所有等于targetSum的路径,由于根结点不算做叶节点所以不能到空节点,边界是叶节点 精确定义 dfs,形参roottargetSum,得到root树所有等于targetSum的路径,叶节点边界更新答案,最后根据孩子情况更新答案 cl
阅读全文
路径总和
摘要:详细思路 dfs,参数root和targetsum,求出root树是否有路径和为targetsum的 精确定义 dfs,参数root和targetsum,求出root树是否有路径和为targetsum,haveTarget为true提前返回,叶节点边界返回,最后返回需要分情况一个儿子和两个儿子 cl
阅读全文
二叉树的最小深度
摘要:详细思路 dfs,形参root,求出root树的最小深度, 精确定义 dfs,形参root,求出root树的最小深度,root为叶节点边界返回1,如果根结点的左右子树一棵有而一棵为空,最小深度绝对不是1,而要看非空的子树的最小深度,所以只递推非空节点,而不递推空节点 class Solution {
阅读全文
平衡二叉树
摘要:详细思路 判断每个节点的左右子树最大深度差,递归,dfs1形参root可判断整棵树是否为平衡二叉树,边界返回0,提前不满足返回,最后返回,提前不满足用深度,dfs2求最大深度,形参root可以求出root树的最大深度 精确定义 dfs1,形参root判断root树是否为平衡二叉树,空节点边界返回tr
阅读全文
有序链表转换成二叉搜索树
摘要:详细思路 递归,想要高度平衡,就应该找到中点,形参leftright是形成二叉搜索树的节点下标,head是数据,找到中点,要么省时间用vector,要么省空间用快慢指针找到中点 精确定义 dfs,形参leftright数据nums,生成高度平衡二叉搜索树,left>right返回空,最后返回 cla
阅读全文
将有序数组转化成二叉搜索树
摘要:详细思路 dfs,形参leftright数据nums,生成一棵高度平衡的二叉搜索树,想要高度平衡可以将中点的值作为根结点 精确定义 dfs,形参leftright数据nums,生成高度平衡二叉搜索树,left>right返回空,最后返回 class Solution { public: TreeNo
阅读全文
二叉树的层序遍历II
摘要:详细思路 层序遍历,push更新答案pop,固定大小,最后翻转答案 class Solution { public: vector<vector<int>> levelOrderBottom(TreeNode* root) { if(!root)return {}; queue<TreeNode*>
阅读全文
从中序与后序遍历序列构造二叉树
摘要:详细思路 dfs,形参left1right1是中序的一整棵树的节点,形参left2right2是后序的一整棵树的节点, 资源inorderpostorderindex,dfs可以生产一整棵树,只需要找到根结点接上递归左子树和递归 右子树,需要找到左子树left1right1left2right2和右
阅读全文
从前序与中序遍历序列构造二叉树
摘要:详细思路 dfs,参数left1,right1是一棵树的前序遍历节点范围,left2right'2是一棵树的中序遍历节点范围,preorder inorder是携带数据,dfs可以构建出一棵完整的树,只需要找到根结点,再找到左子树的四个参数,右子树的四个参数,dfs构造左子树和右子树并连接,怎么找到
阅读全文
二叉树的最大深度
摘要:详细思路 dfs,需要root,求出该root树的最大深度 精确定义 dfs,参数root求出root树的最大深度,边界root空返回0,最后返回左右最大深度+1 class Solution { public: int maxDepth(TreeNode* root) { if(!root)ret
阅读全文
二叉树锯齿形层序遍历
摘要:详细思路 层序遍历,pop更新答案push,更新答案用isleft来reverse,固定大小for来进行一层一层 class Solution { public: vector<vector<int>> zigzagLevelOrder(TreeNode* root) { if(!root)retu
阅读全文
对称二叉树
摘要:详细思路 dfs,判断root1root2两棵树是否为镜像 精确定义 dfs,树root1和数roo2是否为镜像,如果都是空true,如果一个空false,如果val不同是false, 否则判断树roo1->left和树root2->right是否镜像,也要判断树root1->right和树root
阅读全文
相同的树
摘要:详细思路 递归,重点是边界返回,提前返回,最后返回,函数定义、参数定义、返回值定义 dfs,形参root1,root2可判断整棵树是否相同 精确定义 dfs 数root1和数root2是否相同,两颗都空true,一棵为空提前返回false,值不同提前返回false, class Solution {
阅读全文
恢复二叉搜索树
摘要:详细思路 中序遍历,123456变125436,只需要发现异常的第一对54 和第二对43,要有node1记录第一个异常,node2记录第二个异常,pre记录上一次节点;然后交换node1和node2的值 精确定义 dfs中序遍历 node1第一个异常:5 node2第二个异常:3 pre上次 cla
阅读全文
验证二叉搜索树
摘要:详细思路 递归难点在于dfs函数、参数、返回值的定义和返回的时机(边界返回,提前返回,最后返回) dfs,有上界up和下界low,判断左右子树是否超出up和low,左子树的up是root->val,右子树的low是root->val 精确定义 dfs判断root树是否在up和low之内,如果是空就是
阅读全文
不同的二叉搜索树
摘要:详细思路 二叉树果断递归,枚举每一个数作为根结点,从左右分别调用dfs得到左右二叉搜索树的分别的个数,答案就是组合就是两边的个数相乘, 精确定义 dfs m为二叉搜索树的长度,如果m=1或0返回1,最后返回长度为m的二叉搜索树的个数' class Solution { public: int num
阅读全文
不同的二叉搜索树
摘要:详细思路 二叉树能用递归就用递归,递归定义好形参含义、返回的含义、函数的含义,返回的时机 枚举每一个值作为根结点,从这个根结点左边调用递归函数找到根结点左子树集合,从根结点右边调用递归函数找到根结点右子树集合,从两个集合中枚举并将根结点连接作为答案更新答案。想要利用递归函数找到根结点左子树集合,需要
阅读全文
二叉树中序遍历
摘要:详细思路 cur是当前需要判断,只有当前想要才push,只有想使用值才pop,二叉树必画六星图 class Solution { public: vector<int> inorderTraversal(TreeNode* root) { vector<int> res; stack<TreeNod
阅读全文
浙公网安备 33010602011771号