02 2023 档案
摘要:LC93. 复原IP地址 细节太多了(调了不久才调通): 剪纸操作和不合法的直接返回 段位以0为开头的数字不合法 段位如果大于255了不合法 段位里有非正整数字符不合法(但题意说明字符串只包含数字) 终止条件的判断:用完s中的全部字符,且dot('.')个数要符合要求 开始用s = "10123"来
阅读全文
摘要:LC39. 组合总和 vector<int> temp; int sum = 0; void combinationSumLoop(vector<vector<int>>& result, vector<int>& candidates, int index, const int& target)
阅读全文
摘要:LC216. 组合总和 Ⅲ 与昨天的“LC77-组合”类似,就是在昨天终止条件只需计算元素个数的基础上,再加一个总和为规定值的条件,回溯时,把sum、count、temp这些变量都一起回溯 int sum = 0; int count = 0; vector<int> temp; void comb
阅读全文
摘要:回溯算法理论基础 回溯法,一般可以解决如下几种问题: 组合问题:N个数里面按一定规则找出k个数的集合 切割问题:一个字符串按一定规则有几种切割方式 子集问题:一个N个数的集合里有多少符合条件的子集 排列问题:N个数按一定规则全排列,有几种排列方式 棋盘问题:N皇后,解数独等等 回溯法解决的问题都可以
阅读全文
摘要:LC669. 修剪二叉搜索树 相当于一个中序遍历吧,当某个节点<low时,其右子树的各个节点值虽然都比该节点值大,但仍可能存在<low的,所以要据于次节点,向其右子树进军遍历,等回溯时,delete掉该节点,返回的right要返回到上层递归,即该节点的父节点去接收这个right作为新的孩子节点。(奇
阅读全文
摘要:LC235. 二叉搜索树的最近公共祖先 利用二叉搜索树的特性,中序遍历,如果当前节点的值大于q和p的值,公共祖先一定在当前节点的左子树中,同理小于q和p值时,公共祖先一定在当前节点的右子树。一旦找到介于p和q之间值的节点,则一定是最近公共祖先 TreeNode* lowestCommonAncest
阅读全文
摘要:LC530. 二叉搜索树的最小绝对差 这道题只要是在思考怎么不用另外写多一个函数进行递归,且不用多定义一个成员变量min_result,如下所示: int min_result = INT_MAX; TreeNode* prev = nullptr; void getMinDiffLoop(Tree
阅读全文
摘要:LC654. 最大二叉树 内存消耗只击败10% TreeNode* buildTree(vector<int> nums) { int max = nums[0]; int index = 0; for (int i = 1; i < nums.size(); i++) { if (nums[i]
阅读全文
摘要:总结思考: 目前涉及基于二叉树的特性,进行递归的方案有如下: 左右子树不相干的递归 回溯,左右子树不相干的递归:用前序遍历,先处理"中"节点,判断是否达到终止条件进行相关处理(终止条件为 if(root == nullptr) 或者 if(root->left == nullptr && root-
阅读全文
摘要:LC513. 找树左下角的值 这道题用层次遍历,更容易做 int findBottomLeftValue(TreeNode* root) { int result = 0; int size = 0; queue<TreeNode*> que; TreeNode* curr = nullptr; i
阅读全文
摘要:LC110. 平衡二叉树 递归做法一次通过,其实也就是对比:某个节点的左子树和右子树的最大深度的绝对值不大于1,即可认为是平衡二叉树 class Solution { public: bool flag; int checkBalanced(TreeNode* root) { if (root ==
阅读全文
摘要:深度 二叉树任意一个节点到根节点的距离(这条路径包含的节点数) 高度 二叉树任意一个节点到叶子节点的距离 LC104. 二叉树的最大深度 递归解法 int maxdepth(treenode* root) { int leftdepth = 0, rightdepth = 0; if (root =
阅读全文
摘要:二叉树层次遍历的相关题目 102.二叉树的层序遍历 107.二叉树的层次遍历II 199.二叉树的右视图 637.二叉树的层平均值 429.N叉树的层序遍历 515.在每个树行中找最大值 116.填充每个节点的下一个右侧节点指针 117.填充每个节点的下一个右侧节点指针II 104.二叉树的最大深度
阅读全文
摘要:LC144、LC145、LC94-二叉树的前中后遍历 二叉树递归遍历 比较容易实现 struct TreeNode { int val; TreeNode* left; TreeNode* right; TreeNode(int x = 0) : val(x), left(nullptr), rig
阅读全文
摘要:LC239. 滑动窗口最大值 思路分析: 1、暴力出奇迹,对n个元素各遍历k次,记录最大值,复杂度O(n * k) 2、如果存在一种数据结构,能模拟滑动串口,且能提供pop()、push()、getMaxValue()三种接口,该题目就简单易得了。但现在不存在这样一种数据结构 3、使用优先级队列(大
阅读全文
摘要:LC20. 有效的括号 做法和思路比较简单直接,没考虑代码的优化和简洁性 bool isValid(string s) { int i; int size = s.size(); stack<char> sta; for (i = 0; i < size; i++) { int ch = 0; if
阅读全文
摘要:LC232. 用栈实现队列 之前看过相关的实现方法,但在想具体实现上,还是略显冗余。 我的思路是,用一个标志位method记录当前是push或pop/top操作,如果有操作的更换,都进行一次栈元素转移,实则是多余操作。 Carl讲解,分别定义一个StaIn和StaOut,StaOut因为是用于pop
阅读全文
摘要:KMP算法 前缀是包含首字母,不包含尾字母的所有子串。 后缀是包含尾字母,不包含首字母的所有子串。 如有: 文本串 aabaabaaf 模式串 aabaaf 对模式串来说,其前后缀: | 前缀有 | 后缀有 | | | | | a | f | | aa | af | | aab | aaf
阅读全文
摘要:LC344. 反转字符串 void reverseString(vector<char>& s) { int size = s.size(); int left = 0, right = size - 1; while (left < right) { s[left] ^= s[right]; s[
阅读全文
摘要:LC454. 四数之和Ⅱ 先按O(n^2)将4组分成两组后,再按照两数之和的做法即可。其中umap中存储的value值是key出现的次数。 int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vec
阅读全文
摘要:哈希表理论知识 C++常见的三种哈希结构 数组 set(集合) map(映射) 在C++中,set 和 map 分别提供以下三种数据结构,其底层实现以及优劣如下表所示: | 集合 | 底层实现 | 是否有序 | 数值是否可以重复 | 能否更改数值 | 查询效率 | 增删效率 | | | | | |
阅读全文
摘要:LC24. 两两交换链表中的节点 有点像反转链表的思路,参考其中的思路,写出来了一个,但逻辑有点绕,而且对一条链表的开始的两个节点没有写出通用的代码。 我的思路是:设置虚拟头指针,curr从head开始,最后返回的是head->next Carl讲解思路:设置虚拟头节点dummyhead,curr从
阅读全文
摘要:LC203. 移除链表元素 本题最关键是要理解虚拟头结点的使用技巧,这个对链表题目很重要。 自己在做时,定义了一个虚拟头节点,然后又分别定义了ptr和prev指向迭代中当前的节点和上一个节点,定义的变量有点多,但是这种思路更容易想出且更方便个人理解。 /** * Definition for sin
阅读全文
摘要:LC977. 有序数组的平方 有了昨天刷题的总结和思考,根据: 条件left <= right,总与右边界right = numsize - 1,nums[right]成对 条件left < right,总与右边界right = numsize,nums[right - 1]成对 比较轻松地解决了容
阅读全文
摘要:LC704. 二分查找 二分法编码时的难点,在于对数组边界问题的处理上。处理该问题的思想有两种,这两者的区别是基于数学里区间的概念去解释的。 对于区间,[1,1]的取值是合理的,而[1,1)是不合理的。 左闭右闭写法: 因为[1,1]是合理的,所以left是可以等于right的,而且在更新索引下
阅读全文

浙公网安备 33010602011771号