03 2022 档案

摘要:✅做题思路or感想: 在删除一个节点的时候可能有以下情况 找不到节点,那么就之间返回最开始的树就好了 找到了节点 节点是叶子节点,则直接删掉就好了 节点一边是空的,另一遍是有子树的,则直接把该节点的子节点返回给该节点的前一个节点,然后把这个节点删除 节点两边都是非空的,则把节点的左子树接到右子树的最 阅读全文
posted @ 2022-03-31 14:35 北原春希 阅读(45) 评论(0) 推荐(0) 编辑
摘要:✅做题思路or感想: 这里的插入值的操作不是在节点和节点直接插一个新节点,而是在老的二叉树的末尾新增节点。。。 故这里直接利用二叉搜索树的特性直接找新节点位置就好了 值得注意的是这里是需要让前一个节点链接新节点,也就是存在父子节点之间的赋值操作,所以这里要记录上一个节点!!! class Solut 阅读全文
posted @ 2022-03-30 16:55 北原春希 阅读(22) 评论(0) 推荐(0) 编辑
摘要:✅做题思路or感想: 递归一条边的写法: if (dfs(root->left))return; if (dfs(root->right))return; 搜索整棵树的写法 left = dfs(root->left); right = dfs(root->right); //left与right的 阅读全文
posted @ 2022-03-30 16:18 北原春希 阅读(22) 评论(0) 推荐(0) 编辑
摘要:✅做题思路or感想: 这道题教会了我一个很重要的点:当递归函数有返回值时,遍历二叉树的方法论 递归一条边的写法: if (dfs(root->left))return; if (dfs(root->right))return; 搜索整棵树的写法 left = dfs(root->left); rig 阅读全文
posted @ 2022-03-30 12:25 北原春希 阅读(30) 评论(0) 推荐(0) 编辑
摘要:✅做题思路or感想: 直接用map来记每一个节点值的出现次数,然后输出最高次数的节点值就好了 class Solution { public: unordered_map<int, int>HashMap; int result = 0; void dfs(TreeNode* root) { if 阅读全文
posted @ 2022-03-30 10:53 北原春希 阅读(30) 评论(0) 推荐(0) 编辑
摘要:✅做题思路or感想: 对于二叉搜索树,用中序遍历时,二叉树的节点值是递增的 对于二叉搜索树,用中序遍历时,二叉树的节点值是递增的 对于二叉搜索树,用中序遍历时,二叉树的节点值是递增的 虽然这里求的是树中任意两个不同节点的最小差值,但是由于二叉搜索树在中序遍历中是单调递增的,所以只需要比较当前节点和上 阅读全文
posted @ 2022-03-29 21:22 北原春希 阅读(32) 评论(0) 推荐(0) 编辑
摘要:✅做题思路or感想: 对于二叉搜索树,用中序遍历时,二叉树的节点值是递增的 对于二叉搜索树,用中序遍历时,二叉树的节点值是递增的 对于二叉搜索树,用中序遍历时,二叉树的节点值是递增的 我真是服了我怎么老是忘记啊 故这里的思路就是判断是不是递增了,懂了上面的话后就相当简单了 class Solutio 阅读全文
posted @ 2022-03-29 21:11 北原春希 阅读(26) 评论(0) 推荐(0) 编辑
摘要:✅做题思路or感想: 递归参数:一个遍历节点,一个比较节点值的val 递归中止条件:cur == nullptr为止,即是节点遍历到了头 单层递归逻辑:比较节点值和目标值 如果相等,则给预设的节点赋值 如果大了,就往左节点走 如果小了,就往右节点走 最后在主函数返回预设节点 class Soluti 阅读全文
posted @ 2022-03-29 20:46 北原春希 阅读(31) 评论(0) 推荐(0) 编辑
摘要:✅做题思路or感想: 有返回值的递归果然还是特别不熟练啊 递归参数:因为要同时遍历两棵树,所以要同时传入两棵树的节点! 递归中止条件:当其中一个节点无的时候,就返还另一个节点(两个节点都无,就返回空节点) 递归单层逻辑:两个节点的值相加(因为前面中止条件决定了这里的两个节点都必定不是空节点) 有返回 阅读全文
posted @ 2022-03-29 20:32 北原春希 阅读(29) 评论(0) 推荐(0) 编辑
摘要:✅做题思路or感想: 根据前序遍历找根节点 由前序遍历根节点的值来切割中序数组,再由中序数组切割前序数组,最终切割成左子树的中序,前序数组和右子树的中序,前序数组。 递归造根节点的左子树和右子树 class Solution { public: TreeNode* buildTree(vector< 阅读全文
posted @ 2022-03-29 20:19 北原春希 阅读(24) 评论(0) 推荐(0) 编辑
摘要:✅做题思路or感想: 这道题要从前中后序遍历的特点入手。因为后序遍历的最后一个节点必是根节点,故从次开始 如果数组长度为0,则说明是空节点 如果数组不为空,那么后序数组的最后一个元素作为节点元素 找到后序数组的最后一个元素在中序数组中的位置,作为切割位置 利用切割位置把中,后序数组切成左子树的中,后 阅读全文
posted @ 2022-03-28 22:59 北原春希 阅读(25) 评论(0) 推荐(0) 编辑
摘要:✅做题思路or感想: 也是遍历一遍二叉树,判断路径总和和是否是叶子节点,要注意的是这里还需要加一个vector来记录路径 class Solution { public: vector<vector<int>>result; void dfs(TreeNode* cur, vector<int>ve 阅读全文
posted @ 2022-03-28 22:53 北原春希 阅读(26) 评论(0) 推荐(0) 编辑
摘要:✅做题思路or感想: 也是遍历一遍二叉树的路径,每次遍历一个节点就把targeSum减去对应的节点值,如果最后是叶子节点并且targeSum为0,则符合条件 class Solution { public: bool flag = false; void dfs(TreeNode* cur, int 阅读全文
posted @ 2022-03-28 22:50 北原春希 阅读(27) 评论(0) 推荐(0) 编辑
摘要:✅做题思路or感想: 直接遍历二叉树,然后用一个字符串记录一条遍历路径,然后遍历到叶子节点的时候就把字符串加入result里就好了 class Solution { public: vector<string> result; //存答案 void dfs(TreeNode* cur, string 阅读全文
posted @ 2022-03-28 22:47 北原春希 阅读(31) 评论(0) 推荐(0) 编辑
摘要:✅做题思路or感想: 用递归后序遍历二叉树,然后从底部开始记录高度为0,然后往上加1。 每一次操作节点的时候比较左右子树的高度,如果有一棵树不符合条件,则直接把-1返回到最顶的根节点 class Solution { public: int getDepth(TreeNode* cur) { if 阅读全文
posted @ 2022-03-28 22:44 北原春希 阅读(23) 评论(0) 推荐(0) 编辑
摘要:✅做题思路or感想: 直接递归到叶子节点,然后更新最小值就好了 这不是和上一题一模一样吗 class Solution { public: int result = 99999; void dfs(TreeNode* root, int sum) { if (root->left == nullpt 阅读全文
posted @ 2022-03-27 10:33 北原春希 阅读(24) 评论(0) 推荐(0) 编辑
摘要:✅做题思路or感想: 直接递归到叶子节点,然后更新最大值就好了 class Solution { public: int result = 1; void dfs(TreeNode* cur, int sum) { if (cur->left == nullptr && cur->right == 阅读全文
posted @ 2022-03-27 10:24 北原春希 阅读(24) 评论(0) 推荐(0) 编辑
摘要:✅做题思路or感想: 这题是要同时遍历左子树和右子树 遍历左子树的外侧和右子树的外侧 遍历左子树的内侧和右子树的内侧 最后判读是否外侧和内侧都是对称的 class Solution { public: bool dfs(TreeNode* left, TreeNode* right) { //处理左 阅读全文
posted @ 2022-03-27 10:15 北原春希 阅读(20) 评论(0) 推荐(0) 编辑
摘要:做题思路or感想: 遍历一遍二叉树,然后将遍历节点的左右节点互换就好了 class Solution { public: void dfs(TreeNode* root) { if (root == nullptr)return; swap(root->left, root->right); //交 阅读全文
posted @ 2022-03-27 09:59 北原春希 阅读(31) 评论(0) 推荐(0) 编辑
摘要:二叉树的层序遍历(bfs) ✅做题思路or感想: 利用队列来实现层序遍历 当明确每一层直接的元素不用区别对待时,其实代码中的size可以不写,但在这里要根据每一层来进行分组,所以要写size 当队列为空时,结束bfs class Solution { public: vector<vector<in 阅读全文
posted @ 2022-03-26 14:03 北原春希 阅读(18) 评论(0) 推荐(0) 编辑
摘要:二叉树的遍历 前序遍历 遍历顺序:中,左,右 代码实现: void dfs(TreeNode* root) { if (root != nullptr)result.push_back(root->val); if (root->left != nullptr)dfs(root->left); if 阅读全文
posted @ 2022-03-26 13:48 北原春希 阅读(32) 评论(0) 推荐(0) 编辑
摘要:Virtual Function(虚函数)in c++ 用法: virtual void log() { std::cout << "hello world!" << std::endl; } 当派生类和父类有函数名的冲突时: 可以直接用::来说明所用函数到底是哪一个类的 🍎若父类的重名函数为虚函 阅读全文
posted @ 2022-03-25 22:17 北原春希 阅读(37) 评论(0) 推荐(0) 编辑
摘要:enum in c++ enum的实用的定义:给一个值指定一个名称。enums是一种给值命名的方式。 枚举值就是一个整数 用enum的目的:增加程序的可读性 enum的用法:enums [枚举的类名] 枚举中的数是永远递增的,而且变化量为1 enum A { a,b,c //甚至不需要加分号 } / 阅读全文
posted @ 2022-03-25 22:16 北原春希 阅读(30) 评论(0) 推荐(0) 编辑
摘要:✔做题思路or感想: 先说感想:二刷的我又对这道题写了一个小时,可恶 这道题用单调栈比较好理解 用单调栈来储存下标!用下标来计算宽度,用height[i]来算高度 要保持单调栈递减的状态,符合题意 当height[i]=height[st.top()],则要替换掉栈顶的元素,因为这里是需要用最右的柱 阅读全文
posted @ 2022-03-25 21:01 北原春希 阅读(57) 评论(0) 推荐(0) 编辑
摘要:✔做题思路or感想: 单调队列可以通过维护单调性去解决区间内最大或最小的问题 一般自己造新的DIY队列时,可以用双向队列,更方便 这一道题的思路是用单调队列维护滑动区间内的最大值,使得单调队列的队首就是区间内的最大值 为了实现这一点,可以这样来设计: pop:如果窗口移除的元素value等于单调队列 阅读全文
posted @ 2022-03-25 18:59 北原春希 阅读(25) 评论(0) 推荐(0) 编辑
摘要:✔做题思路or感想: 摆明了用栈来写 如果字符串是正数,则把字符串转化为数字push进栈中 如果字符串是负数,则先忽略第一个负号并将其转化为数字,最后再乘个-1,push进栈中 如果字符串是运算符,则取栈顶前两个元素出来进行运算,然后把结果再push进栈中 最后栈顶元素就是答案 class Solu 阅读全文
posted @ 2022-03-25 12:12 北原春希 阅读(34) 评论(0) 推荐(0) 编辑
摘要:✔做题思路 or 感想: 做这种对称匹配类问题,相当适合用栈来解 有三种不匹配情况 {],单纯不匹配 {{}左边多了 []]右边多了 遇到这三种直接return false就好 class Solution { public: bool isValid(string s) { stack<char> 阅读全文
posted @ 2022-03-25 11:49 北原春希 阅读(22) 评论(0) 推荐(0) 编辑
摘要:✔做题思路 or 感想 : 用队列实现栈,仅仅用一个队列就可以了 push:直接push进队列就好 pop:把队首加到队尾,直到最开始的队尾变成了队首,这样就可以取最开始的队尾的值了。 peek:这个和pop的操作差不多,但是最后的操作有别。在最后取完队首(即是最开始的栈顶)后,要再把队首加到队尾去 阅读全文
posted @ 2022-03-25 11:24 北原春希 阅读(19) 评论(0) 推荐(0) 编辑
摘要:✔做题思路 or 感想 : 用栈来实现队列的一般方法是:造一个输入栈和一个输出栈来模拟队列 当要push时,则把元素push进输入栈 当要pop时,检测输出栈是否有元素。若有,则直接把输出栈的栈顶元素pop掉就好。若无,则要先把输入栈的元素倒进输出栈,再进行操作 class MyQueue { pu 阅读全文
posted @ 2022-03-25 11:07 北原春希 阅读(32) 评论(0) 推荐(0) 编辑
摘要:Static in C++ static根据上下文会有两种含义,他们的区别如下 **在类class或者是在结构体struct 外 **使用static 类外的static修饰的符号在link阶段是局部的 **在类class或者是在结构体struct 内 **使用static 若在类内或结构体内使用, 阅读全文
posted @ 2022-03-24 23:11 北原春希 阅读(31) 评论(0) 推荐(0) 编辑
摘要:✔做题思路 or 感想 : 就借由这道题来理解一下kmp算法吧 kmp算法的操作过程我觉得有句话很合适 :KMP 算法永不回退 目标字符串 的指针 i,不走回头路(不会重复扫描 目标字符串),而是借助 next 数组中储存的信息把 模板字符串 移到正确的位置继续匹配 kmp算法的重要点是计算next 阅读全文
posted @ 2022-03-24 20:53 北原春希 阅读(36) 评论(0) 推荐(0) 编辑
摘要:✔做题思路 or 感想 : 乍一看很猛,其实思路就仨 把整个字符串反转 删除多余空格 然后再把每一个单词反转 反转,删除空格用的都是双指针法,太香了 数组中的删除操作总体思想虽然是把符合条件的数往前面推,但这个"推"并不是交换值!而是直接往前面把不符合条件的值直接替换了!!! class Solut 阅读全文
posted @ 2022-03-24 14:37 北原春希 阅读(41) 评论(0) 推荐(0) 编辑
摘要:✔做题思路 or 感想 : 1.这道题乍一看要分三种情况,实际上只用分两种情况 : 当剩下字符小于k个时,反转剩下所有字符 否则就反转前k个字符 2.要记得 reverse 函数的用法,是 reverse(前, 后),而不是 字符串.reverse(巴拉巴拉) 3.如果说要按照固定规律一段一段的处理 阅读全文
posted @ 2022-03-24 13:47 北原春希 阅读(29) 评论(0) 推荐(0) 编辑
摘要:✔做题思路 or 感想 : 1.利用双指针,一个指针指向前面,一个指向尾端,两个指针做着交换工作,然后不断向中心逼近 class Solution { public: void reverseString(vector<char>& s) { int left = 0, right = s.size 阅读全文
posted @ 2022-03-24 13:31 北原春希 阅读(24) 评论(0) 推荐(0) 编辑
摘要:✔做题思路 or 感想 : 1.理解了上一题的三数之和后,这一题其实也就差不多了,同样的套路,同样的方法,不过就多加了一层for的事情罢了,如果往后要求5数之和,n数之和,亦是如此了 2.这一题的思路仍然是 利用四个指针求和 + 去重操作,只要代码不写歪,大体思路都能对 class Solution 阅读全文
posted @ 2022-03-24 13:16 北原春希 阅读(42) 评论(0) 推荐(0) 编辑
摘要:做题思路 or 感想: 1,我以为二刷以后我就是开无双了,直到我遇到这道题,细节多的不谈,这种三个指针的做法我是真的忘了,三个指针也不谈,他甚至还要去重,太繁杂了 2,用三个指针来代表三个相加的数,且有大小顺序 nums[ i ] < nums[ left ] < nums[ right ] 3,要 阅读全文
posted @ 2022-03-23 21:15 北原春希 阅读(39) 评论(0) 推荐(0) 编辑
摘要:做题思路 or 感想: 1,用一个哈希表储存 A + B 的各种和的个数,把题目转化为两个数(A + B 和 C + D)之和,知道这个了以后思路就开阔很多了 2,因为这里是四个数组,所以不需要查重,直接搜,find 搜到直接符合条件就好了 1 class Solution { 2 public: 阅读全文
posted @ 2022-03-23 19:55 北原春希 阅读(36) 评论(0) 推荐(0) 编辑
摘要:做题思路 or 感想 : 1,这种 N 数之和一般是可以用哈希表来解决 2,一般找差就直接用 哈希表自带的 find 去查差值是否存在就好了 3,惊了vector并不自带 find ,平常用的都是algorithm里的,而像 map , set 都是自带 find 的,所以在力扣刷题里要用 find 阅读全文
posted @ 2022-03-23 19:39 北原春希 阅读(35) 评论(0) 推荐(0) 编辑
摘要:做题思路 or 感想 : 1,一眼暴力,但是如果纯暴力的话又太费时,所以这里用了一下set,其实某种意义上仍然是暴力? 2,set的去重很好用,把vector倒进set,再把set倒回vector就可以实现去重,但是很费时间,只能说是走头无路时的暴力解法了 1 class Solution { 2 阅读全文
posted @ 2022-03-23 19:18 北原春希 阅读(23) 评论(0) 推荐(0) 编辑
摘要:做题思路 or 感想 : 1,这里可以把题目简化为求两个字符串中的各种字符的个数是否相等,想到这个就很简单了 2,如果不是特殊情况,用map的时候尽量用 unorderde_map ,读写效率更高 1 class Solution { 2 public: 3 bool isAnagram(strin 阅读全文
posted @ 2022-03-23 19:05 北原春希 阅读(20) 评论(0) 推荐(0) 编辑
摘要:做题思路 or 感想 : 1,这一题用快慢指针来判断是否有环,快慢指针同一起点,速度不同,如果有环,则必定会相遇 2,第二个有意思的点就是数论环节来弄出环入口了,真的太精妙了,但因为我表述能力不好,这里就不谈了 1 /** 2 * Definition for singly-linked list. 阅读全文
posted @ 2022-03-23 18:54 北原春希 阅读(22) 评论(0) 推荐(0) 编辑
摘要:做题思路 or 感想: 1,用的还是快慢指针,不得不说我一开始真的没想到用快慢指针卡成一个“直尺”这样去找前n的元素,真的太秒了这个思路 2,这里是需要虚拟头节点的,只要有删除操作都需要,因为头节点也可能是删除目标 3,这里的快指针最后是要指向 nullptr 的,不能指向一个最后一个节点,为了打消 阅读全文
posted @ 2022-03-23 18:29 北原春希 阅读(37) 评论(0) 推荐(0) 编辑
摘要:做题思路 or 感想: 1,用双指针法便可解决 2,这种链表的题自己画一下图就很快理解了,相当有意思啊 1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next 阅读全文
posted @ 2022-03-23 17:29 北原春希 阅读(24) 评论(0) 推荐(0) 编辑
摘要:做题思路: 1,就考察了链表的基础操作,题目要求什么就照做就好了 1 class MyLinkedList { 2 public: 3 struct LinkedList { //甚至还先需要自己整一个链表的结构体,平时做题做惯了这里会忘先弄结构体了 4 int val; 5 LinkedList* 阅读全文
posted @ 2022-03-23 17:16 北原春希 阅读(27) 评论(0) 推荐(0) 编辑
摘要:做题思路: 1,因为要删掉一个节点,要将他的前一个节点指向目标节点的后一个节点,即是与目标节点的前一个节点息息相关,但头节点又没有前一个节点,所以如果正常做要分类讨论 但这里用一个虚拟头节点来指向头节点,这样头节点就有了前一个节点。 2,因为我是c++,所以上面的做法会浪费空间,要手动删除内存空间, 阅读全文
posted @ 2022-03-23 16:38 北原春希 阅读(22) 评论(0) 推荐(0) 编辑
摘要:做题思路: 1,这种题一般我是先自己画一下n = 2, n = 3, n = 4, n = 5的图,然后根据图的规律来写 2,虽然找到了规律,但是我觉得这道题还是考的是做题者对自己代码的操控能力..... 3,最后,这道题的代码是单纯的我想到那就写到那的代码,就仅仅是将自己头中简单的思想具体化,所以 阅读全文
posted @ 2022-03-23 16:27 北原春希 阅读(23) 评论(0) 推荐(0) 编辑
摘要:一眼暴力 一,暴力做题思路: 暴力没什么好说的,就纯暴力解就对了 1 class Solution { 2 public: 3 int minSubArrayLen(int target, vector<int>& nums) { 4 int result = 99999; //为了让result的 阅读全文
posted @ 2022-03-23 11:48 北原春希 阅读(18) 评论(0) 推荐(0) 编辑
摘要:做题思路: 1.用快慢指针法可以用一个for完成两个for的事情 2.快指针去找符合条件的数,找到后交换快慢指针的值,这种做法相当于是把符合条件的数全部搬到前面来,把不符合条件的数挤到后面 class Solution { public: int removeElement(vector<int>& 阅读全文
posted @ 2022-03-23 11:18 北原春希 阅读(25) 评论(0) 推荐(0) 编辑
摘要:做题思路: 1.要注意先确定二分的区间,这里是 [ left, right ] 两边闭合 2.因为left = right 在 [ left, right ] 中是有意义的,所以二分法的循环判断条件应当是 left <= right class Solution { public: int sear 阅读全文
posted @ 2022-03-23 11:10 北原春希 阅读(33) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示