随笔分类 - 代码随想录二刷
为了加深自己对代码的印象而成
方便自己以后忘记方法论时回头可以找得到当时我的思想
摘要:✅做题思路or感想 排列问题,一眼回溯法 排列问题注重元素间的排序,而集合问题不用。 故这里并不需要startIndex来进行控制元素取值范围,而是需要用used数组来记录元素是否使用过,避免一个元素的多次使用 递归三部曲 递归参数 用一个used数组来记录使用记录 递归中止条件 当temp和原数组
阅读全文
摘要:✅做题思路or感想 这一题依旧是子序列问题,用回溯法 然而这道题在有相同元素的情况下还要求不同的递增子序列,这就代表了不能对原数组进行排序!,因此就不能像前面一样用used数组进行树层去重了 我思来想去找不到更好的方法,只能靠用set强行去重来AC了,惭愧 class Solution { publ
阅读全文
摘要:✅做题思路or感想 这道题仍然是用回溯,和普通的求集合的题有区别的地方是:集合中有相同的元素 这里处理相同元素的做法是用一个used数组来做到树层去重,注意这种做法需要先对遍历的数组进行排序!!!!!!! 递归三部曲: 递归参数 这里除了老生常谈的startIndex外,还要额外加一个used数组进
阅读全文
摘要:✅做题思路or感想 集合的经典问题,直接回溯法,递归三部曲。 递归参数 这里用一个startIndex来控制可选元素的范围,从而进行有效去重。这个做法老生常谈了 递归终止条件 这一题甚至不需要递归中止条件........ 单层递归逻辑 用result来实时记录变化的temp就好了 class Sol
阅读全文
摘要:✅做题思路or感想 这种字符串切割的问题都可以用回溯法来解决 递归三部曲: 递归参数 因为要切割字符串,所以要用一个startIndex来控制子串的开头位置,即是会切割出一个范围是[startIndex, i]的子串 递归中止条件 这里因为IP地址有正好四个整数(子串)构成,所以当切割的子串数量为4
阅读全文
摘要:✅做题思路or感想 这题的主题有两个:分割字符串,检查是否回文 难点在于第一点,这里用startIndex作为子串开始的地方,i作为子串结束的地方,用s.substr(startIndex, i - startIndex + 1)来分割出子串 递归单层逻辑就是判断子串是否回文,如果回文,则加入vec
阅读全文
摘要:✅做题思路or感想 这题主思路是回溯 要注意的是会有元素的重复,所以这里要做树层去重 以下去重是需要在排序后才能进行!!!! 在candidates[i]与candidates[i - 1]相同的情况下: 如果used[i - 1] == true,则说明同一树枝使用过candidates[i -
阅读全文
摘要:✅做题思路or感想 这里依旧是找组合,故依旧是用回溯法 而因为这里的元素是可以重复选取的,所以这里的startIndex在递归时不需要+1,或者直接干脆不用startIndex就可以了 但是为了防止[2,2,3],[2,3,2]这种重复,所以需要安排一下子集都是要递增的就好了 class Solut
阅读全文
摘要:✅做题思路or感想 这种组合问题,直接用遍历搜索组合就好了 这里注意的是这里是分组的遍历,所以用一个group来控制分组! class Solution { public: //用一个表来记录电话字符串所代表的字符 const string letterMap[10] = { "", "", "ab
阅读全文
摘要:✅做题思路or感想 经典回溯 用startIndex来控制元素的范围,避免重复 class Solution { public: vector<int>vec; vector<vector<int>>result; void dfs(int k, int n, int startIndex) { /
阅读全文
摘要:✅做题思路or感想: 这道题用回溯的操作即可 值得注意的是这里为了让子集都是递增的(如[2,4],[3,5])所以这里要有一个startIndex来控制元素的范围,使得下一个加入的元素一定比当前处理的元素大 class Solution { public: vector<int>temp; vect
阅读全文
摘要:✅做题思路or感想: 构建二叉树的基本思想:找头节点,分割左右子树的序列 二叉搜索树的找头节点很简单:中间的节点就是头节点,并且就可以就着中间节点进行分割左右子树的序列 class Solution { public: TreeNode* sortedArrayToBST(vector<int>&
阅读全文
摘要:✅做题思路or感想: 这道题的主旋律是:将节点值控制在[low, high]中 这里因为会有删减的操作,所以还是要有父子节点间的赋值,故要用有返回值的递归函数比较方便,且因为要修改一整棵树,所以说要遍历整棵树 首先要明确带返回值的递归函数的代表意义,这里的递归函数表示的是修改好的搜索二叉树的头节点
阅读全文
摘要:✅做题思路or感想: 在删除一个节点的时候可能有以下情况 找不到节点,那么就之间返回最开始的树就好了 找到了节点 节点是叶子节点,则直接删掉就好了 节点一边是空的,另一遍是有子树的,则直接把该节点的子节点返回给该节点的前一个节点,然后把这个节点删除 节点两边都是非空的,则把节点的左子树接到右子树的最
阅读全文
摘要:✅做题思路or感想: 这里的插入值的操作不是在节点和节点直接插一个新节点,而是在老的二叉树的末尾新增节点。。。 故这里直接利用二叉搜索树的特性直接找新节点位置就好了 值得注意的是这里是需要让前一个节点链接新节点,也就是存在父子节点之间的赋值操作,所以这里要记录上一个节点!!! class Solut
阅读全文
摘要:✅做题思路or感想: 递归一条边的写法: if (dfs(root->left))return; if (dfs(root->right))return; 搜索整棵树的写法 left = dfs(root->left); right = dfs(root->right); //left与right的
阅读全文
摘要:✅做题思路or感想: 这道题教会了我一个很重要的点:当递归函数有返回值时,遍历二叉树的方法论 递归一条边的写法: if (dfs(root->left))return; if (dfs(root->right))return; 搜索整棵树的写法 left = dfs(root->left); rig
阅读全文
摘要:✅做题思路or感想: 直接用map来记每一个节点值的出现次数,然后输出最高次数的节点值就好了 class Solution { public: unordered_map<int, int>HashMap; int result = 0; void dfs(TreeNode* root) { if
阅读全文
摘要:✅做题思路or感想: 对于二叉搜索树,用中序遍历时,二叉树的节点值是递增的 对于二叉搜索树,用中序遍历时,二叉树的节点值是递增的 对于二叉搜索树,用中序遍历时,二叉树的节点值是递增的 虽然这里求的是树中任意两个不同节点的最小差值,但是由于二叉搜索树在中序遍历中是单调递增的,所以只需要比较当前节点和上
阅读全文
摘要:✅做题思路or感想: 对于二叉搜索树,用中序遍历时,二叉树的节点值是递增的 对于二叉搜索树,用中序遍历时,二叉树的节点值是递增的 对于二叉搜索树,用中序遍历时,二叉树的节点值是递增的 我真是服了我怎么老是忘记啊 故这里的思路就是判断是不是递增了,懂了上面的话后就相当简单了 class Solutio
阅读全文