合集-代码随想录
摘要:逆波兰表达式 思路 用栈操作运算:遇到数字则入栈;遇到算符则取出栈顶两个数字进行计算,并将结果压入栈中 这里记录string类型相关操作: 判断token是否是数字,不可像char类型用string重载的>=,<=,前者由于用ASCII码表示,后者按字典序比较,例如1<2所以字符串比较 "10" <
阅读全文
摘要:题目 给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 1.左括号必须用相同类型的右括号闭合。 2.左括号必须以正确的顺序闭合。 3.每个右括号都有一个对应的相同类型的左括号。 提示: 1 <= s.length <= 104
阅读全文
摘要:法一、用数组排序 思路 用map保存元素和频率关系 将元素和频率的键值对pair作为vector的基本元素,以频率为准进行从大到小的排序 —— O(nlogn) 输出前K个pair的first,即数字本身 代码 class Solution { public: std::vector<int> to
阅读全文
摘要:递归 每次写递归,都按照这三要素来写,可以保证大家写出正确的递归算法! 确定递归函数的参数和返回值: 确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。 确定终止条件: 写完了递归算法, 运行的时候,经常会遇到栈溢出
阅读全文
摘要:思路 一、层序遍历,时间复杂度O(n) 二、利用完全二叉树性质,时间复杂度O(logn * logn)(小于O(n)) 完全二叉树性质:若树深度为h,则前h-1层节点都达到最大值。第h层节点都集中在最左侧的位置 完全二叉树要么1.是满二叉树 2.最后一层没满 满二叉树计算节点数太方便了,直接用公式2
阅读全文
摘要:自顶向下递归(前序遍历) 这种方法是一开始想到的,虽然ac了但是对于它的本质却不清不楚,不知道时间复杂度,不知道属于前序遍历。 思路 首先得到root节点的左右子树的深度(左右),若深度差绝对值大于1(中),则root为根的树不是平衡二叉树; 否则继续递归root的左右子树,其左右子树都是平衡二叉树
阅读全文
摘要:这两道题目对于递归函数的返回值是不同的,这里进行总结,二叉树遍历中递归函数返回值何时有何时没有。 这里总结如下三点: 如果需要搜索整棵二叉树且不用处理递归返回值,递归函数就不要返回值。(这种情况就是路径总和ii) 如果需要搜索整棵二叉树且需要处理递归返回值,递归函数就需要返回值。 (这种情况我们在2
阅读全文
摘要:递归 最容易想到,采用先序遍历。 1.遍历数组,找出当前区间的最大值; 2.使用该最大值作为根节点; 3.对数组的左半部分和右半部分递归调用构建最大二叉树。 这种方式是标准的 分治法,每次递归都需要遍历当前区间,找到最大值。因此,时间复杂度是 O(n^2),因为每一层递归都会遍历一遍数组,且递归的深
阅读全文
摘要:思路 本题难点在于:如何同时遍历两棵二叉树。 方法和遍历一颗二叉树类似,只是同时传入两棵二叉树的节点。 代码 class Solution { public: TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) { if(root1 == n
阅读全文
摘要:根据定义递归 class Solution { public: bool dfs(TreeNode* root,long long lower,long long upper){ if(root == nullptr)return true; if(root->val <= lower || roo
阅读全文
摘要:本题重点是记录怎样在“递归遍历中记录前后两个指针” 设一个指针pre,而递归函数的参数就是cur。 pre不为空则执行操作,操作结束了pre = cur(包含了pre为空的情况) 代码: class Solution { public: int ans = INT_MAX; TreeNode* pr
阅读全文
摘要:思路 利用二叉搜索树性质,先序遍历是递增序列 加上进阶要求,问题转换为:对于一个递增序列,在时间复杂度O(N),空间复杂度O(1)内找到所有的众数 由于是递增序列,因此众数一定是挨在一起的。遍历序列时判断前后两个数是否相同来增加该数出现次数。(初始化次数为1) 利用上一题的“记录前后两个节点”的操作
阅读全文
摘要:递归 最近公共祖先定义:设节点 root 为节点 p,q 的某公共祖先,若其左子节点 root.left 和右子节点root.right 都不是 p,q 的公共祖先,则称 root 是“最近的公共祖先”。 若 root是 p,q的 最近公共祖先 ,则只可能为以下情况之一 如果p和q在节点root的两
阅读全文
摘要:这道题稍微有点难,我是突然想到要不试试把数组排序,画图发现只要出现candidates[i] == candidates[i-1]时(i>start)就可以剪枝,如下图 思路 首先这种去重的问题,用哈希表一般比较麻烦。可以从将数组先排序等变得好处理的角度去思考。 区别 这道题目和39.组合总和如下区
阅读全文
摘要:这道题目最气的一点是,OJ评测输出为空,我想本地调试看看怎么回事,直接让豆包帮忙处理成可以直接运行的样子,没想到豆包帮我debug好了回文串判断方式,导致本地调试没问题。后面才意识到OJ上的回文串处理部分和本地的不一样。 思路 代码 class Solution { public: vector<s
阅读全文
摘要:思路 回溯——超时代码 把选机票当成走迷宫问题,选择一次机票就进入下一个地点,然后标记此次路径已使用。直接使用回溯模板。 vector<string> result; vector<string> path; void backTracking(vector<vector<string>>& tic
阅读全文
摘要:思路 每次递归都遍历第0到n-1列,判断当前位置是否合法——确保不会和之前的皇后同列、同斜线(同行已经通过递归避免了) 那么核心就是 怎么判断是否合法 怎么返回答案 2反而比较重要,因为我一开始就设了个vector<int> queen,表示第i个皇后在第queen[i]列。但这在本题不好用,之后还
阅读全文
摘要:思路 和跳跃游戏I相比,这里要求最小跳跃数。 核心就是什么时候跳跃数+1 记录两个变量 当前能跳跃最远距离 curDis 下一步能跳跃的最远距离 nextDis 只有当移动下标走到curDis了,跳跃数才+1,并且更新curDis。 同时若此时更新的curDis已经大于等于 n-1 了那么就直接re
阅读全文
摘要:思路 第一想法是排序后先把负数取反消耗k,但是这样有个问题:k还剩余,并且所有元素都为正数的时候,不好找最小值去消耗k 故采用绝对值逆序排序,这样就算全是正数了,它也是单调递减的,最小值就是size()-1位置的元素 static bool cmp(int a,int b){ return abs(
阅读全文
摘要:思路 一开始受到“摆动序列”的影响画图,有想过从左往右遍历,if当前孩子大于左孩子就比左孩子大1,else if大于右孩子就比右孩子大1 这样能保证“相邻两个孩子评分更高的孩子会获得更多的糖果。”但是不能保证每个人至少有1个糖果。 于是又想从右向左遍历,对于糖果数小于1个的做处理,此时发现很难通过一
阅读全文