合集-代码随想录

摘要:逆波兰表达式 思路 用栈操作运算:遇到数字则入栈;遇到算符则取出栈顶两个数字进行计算,并将结果压入栈中 这里记录string类型相关操作: 判断token是否是数字,不可像char类型用string重载的>=,<=,前者由于用ASCII码表示,后者按字典序比较,例如1<2所以字符串比较 "10" < 阅读全文
posted @ 2024-10-29 10:56 NeroMegumi 阅读(22) 评论(0) 推荐(1)
摘要:题目 给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 1.左括号必须用相同类型的右括号闭合。 2.左括号必须以正确的顺序闭合。 3.每个右括号都有一个对应的相同类型的左括号。 提示: 1 <= s.length <= 104 阅读全文
posted @ 2024-10-26 11:12 NeroMegumi 阅读(26) 评论(0) 推荐(1)
摘要:法一、用数组排序 思路 用map保存元素和频率关系 将元素和频率的键值对pair作为vector的基本元素,以频率为准进行从大到小的排序 —— O(nlogn) 输出前K个pair的first,即数字本身 代码 class Solution { public: std::vector<int> to 阅读全文
posted @ 2024-10-30 11:13 NeroMegumi 阅读(55) 评论(0) 推荐(0)
摘要:递归 每次写递归,都按照这三要素来写,可以保证大家写出正确的递归算法! 确定递归函数的参数和返回值: 确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。 确定终止条件: 写完了递归算法, 运行的时候,经常会遇到栈溢出 阅读全文
posted @ 2024-11-08 10:50 NeroMegumi 阅读(42) 评论(0) 推荐(0)
摘要:思路 一、层序遍历,时间复杂度O(n) 二、利用完全二叉树性质,时间复杂度O(logn * logn)(小于O(n)) 完全二叉树性质:若树深度为h,则前h-1层节点都达到最大值。第h层节点都集中在最左侧的位置 完全二叉树要么1.是满二叉树 2.最后一层没满 满二叉树计算节点数太方便了,直接用公式2 阅读全文
posted @ 2024-11-11 12:02 NeroMegumi 阅读(61) 评论(0) 推荐(0)
摘要:自顶向下递归(前序遍历) 这种方法是一开始想到的,虽然ac了但是对于它的本质却不清不楚,不知道时间复杂度,不知道属于前序遍历。 思路 首先得到root节点的左右子树的深度(左右),若深度差绝对值大于1(中),则root为根的树不是平衡二叉树; 否则继续递归root的左右子树,其左右子树都是平衡二叉树 阅读全文
posted @ 2024-11-11 12:20 NeroMegumi 阅读(29) 评论(0) 推荐(0)
摘要:这两道题目对于递归函数的返回值是不同的,这里进行总结,二叉树遍历中递归函数返回值何时有何时没有。 这里总结如下三点: 如果需要搜索整棵二叉树且不用处理递归返回值,递归函数就不要返回值。(这种情况就是路径总和ii) 如果需要搜索整棵二叉树且需要处理递归返回值,递归函数就需要返回值。 (这种情况我们在2 阅读全文
posted @ 2024-11-13 11:01 NeroMegumi 阅读(13) 评论(0) 推荐(0)
摘要:递归 最容易想到,采用先序遍历。 1.遍历数组,找出当前区间的最大值; 2.使用该最大值作为根节点; 3.对数组的左半部分和右半部分递归调用构建最大二叉树。 这种方式是标准的 分治法,每次递归都需要遍历当前区间,找到最大值。因此,时间复杂度是 O(n^2),因为每一层递归都会遍历一遍数组,且递归的深 阅读全文
posted @ 2024-11-21 15:18 NeroMegumi 阅读(38) 评论(0) 推荐(0)
摘要:思路 本题难点在于:如何同时遍历两棵二叉树。 方法和遍历一颗二叉树类似,只是同时传入两棵二叉树的节点。 代码 class Solution { public: TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) { if(root1 == n 阅读全文
posted @ 2024-11-22 10:40 NeroMegumi 阅读(32) 评论(0) 推荐(0)
摘要:根据定义递归 class Solution { public: bool dfs(TreeNode* root,long long lower,long long upper){ if(root == nullptr)return true; if(root->val <= lower || roo 阅读全文
posted @ 2024-11-22 11:27 NeroMegumi 阅读(24) 评论(0) 推荐(0)
摘要:本题重点是记录怎样在“递归遍历中记录前后两个指针” 设一个指针pre,而递归函数的参数就是cur。 pre不为空则执行操作,操作结束了pre = cur(包含了pre为空的情况) 代码: class Solution { public: int ans = INT_MAX; TreeNode* pr 阅读全文
posted @ 2024-11-25 09:52 NeroMegumi 阅读(15) 评论(0) 推荐(0)
摘要:思路 利用二叉搜索树性质,先序遍历是递增序列 加上进阶要求,问题转换为:对于一个递增序列,在时间复杂度O(N),空间复杂度O(1)内找到所有的众数 由于是递增序列,因此众数一定是挨在一起的。遍历序列时判断前后两个数是否相同来增加该数出现次数。(初始化次数为1) 利用上一题的“记录前后两个节点”的操作 阅读全文
posted @ 2024-11-25 10:32 NeroMegumi 阅读(23) 评论(0) 推荐(0)
摘要:递归 最近公共祖先定义:设节点 root 为节点 p,q 的某公共祖先,若其左子节点 root.left 和右子节点root.right 都不是 p,q 的公共祖先,则称 root 是“最近的公共祖先”。 若 root是 p,q的 最近公共祖先 ,则只可能为以下情况之一 如果p和q在节点root的两 阅读全文
posted @ 2024-11-26 10:36 NeroMegumi 阅读(29) 评论(0) 推荐(0)
摘要:这道题稍微有点难,我是突然想到要不试试把数组排序,画图发现只要出现candidates[i] == candidates[i-1]时(i>start)就可以剪枝,如下图 思路 首先这种去重的问题,用哈希表一般比较麻烦。可以从将数组先排序等变得好处理的角度去思考。 区别 这道题目和39.组合总和如下区 阅读全文
posted @ 2024-12-04 11:08 NeroMegumi 阅读(15) 评论(0) 推荐(0)
摘要:这道题目最气的一点是,OJ评测输出为空,我想本地调试看看怎么回事,直接让豆包帮忙处理成可以直接运行的样子,没想到豆包帮我debug好了回文串判断方式,导致本地调试没问题。后面才意识到OJ上的回文串处理部分和本地的不一样。 思路 代码 class Solution { public: vector<s 阅读全文
posted @ 2024-12-05 09:47 NeroMegumi 阅读(15) 评论(0) 推荐(0)
摘要:思路 回溯——超时代码 把选机票当成走迷宫问题,选择一次机票就进入下一个地点,然后标记此次路径已使用。直接使用回溯模板。 vector<string> result; vector<string> path; void backTracking(vector<vector<string>>& tic 阅读全文
posted @ 2024-12-12 11:44 NeroMegumi 阅读(30) 评论(0) 推荐(0)
摘要:思路 每次递归都遍历第0到n-1列,判断当前位置是否合法——确保不会和之前的皇后同列、同斜线(同行已经通过递归避免了) 那么核心就是 怎么判断是否合法 怎么返回答案 2反而比较重要,因为我一开始就设了个vector<int> queen,表示第i个皇后在第queen[i]列。但这在本题不好用,之后还 阅读全文
posted @ 2024-12-14 10:30 NeroMegumi 阅读(26) 评论(0) 推荐(0)
摘要:思路 和跳跃游戏I相比,这里要求最小跳跃数。 核心就是什么时候跳跃数+1 记录两个变量 当前能跳跃最远距离 curDis 下一步能跳跃的最远距离 nextDis 只有当移动下标走到curDis了,跳跃数才+1,并且更新curDis。 同时若此时更新的curDis已经大于等于 n-1 了那么就直接re 阅读全文
posted @ 2024-12-16 10:35 NeroMegumi 阅读(23) 评论(0) 推荐(0)
摘要:思路 第一想法是排序后先把负数取反消耗k,但是这样有个问题:k还剩余,并且所有元素都为正数的时候,不好找最小值去消耗k 故采用绝对值逆序排序,这样就算全是正数了,它也是单调递减的,最小值就是size()-1位置的元素 static bool cmp(int a,int b){ return abs( 阅读全文
posted @ 2024-12-16 11:19 NeroMegumi 阅读(19) 评论(0) 推荐(0)
摘要:思路 一开始受到“摆动序列”的影响画图,有想过从左往右遍历,if当前孩子大于左孩子就比左孩子大1,else if大于右孩子就比右孩子大1 这样能保证“相邻两个孩子评分更高的孩子会获得更多的糖果。”但是不能保证每个人至少有1个糖果。 于是又想从右向左遍历,对于糖果数小于1个的做处理,此时发现很难通过一 阅读全文
posted @ 2024-12-17 11:08 NeroMegumi 阅读(21) 评论(0) 推荐(0)
摘要:代码 class Solution { public: static bool cmp(vector<int>& a,vector<int>& b){ if(a[0] == b[0])return a[1]<b[1];//如果身高相同,k更小的在前面 return a[0] > b[0];//身高不 阅读全文
posted @ 2024-12-23 10:41 NeroMegumi 阅读(24) 评论(0) 推荐(0)
摘要:思路 显然本题要对数字按位处理,转化为字符串更好处理。 既然要尽可能的大,那么这个数从高位开始要尽可能地保持不变。 那么我们找到从高到低第一个满足 str[i]>str[i+1] 的位置,然后把 str[i]−- ,再把后面的位置都变成 9 即可 但是由于减小了 str[i] 以后,可能不满足 st 阅读全文
posted @ 2024-12-25 09:21 NeroMegumi 阅读(21) 评论(0) 推荐(0)
摘要:思路 这道题目首先要想,如何放置,才能让摄像头最小的呢? 从题目中示例,其实可以得到启发,我们发现题目示例中的摄像头都没有放在叶子节点上! 这是很重要的一个线索,摄像头可以覆盖上中下三层,如果把摄像头放在叶子节点上,就浪费的一层的覆盖。 所以把摄像头放在叶子节点的父节点位置,才能充分利用摄像头的覆盖 阅读全文
posted @ 2024-12-26 10:58 NeroMegumi 阅读(20) 评论(0) 推荐(0)
摘要:动态规划题目应该如何debug,灵魂三问: 这道题目我举例推导状态转移公式了么? 我打印dp数组的日志了么? 打印出来了dp数组和我想的一样么? 阅读全文
posted @ 2024-12-26 11:49 NeroMegumi 阅读(20) 评论(0) 推荐(0)
摘要:解题思路 本题通过递归 和 二叉搜索树特性解决。 当n=1时,结果是1。如果n>1时,因为根节点值不同对应的二叉搜索树肯定不同,所以我们考虑根为i(2≤i≤n)的情况。 由二叉搜索树特性,根左边一定有i-1个元素,右边一定有n-i个元素。 设f(i)函数返回i个不同元素节点组成的二叉搜索树的个数。所 阅读全文
posted @ 2024-12-28 10:20 NeroMegumi 阅读(33) 评论(0) 推荐(0)
摘要:暴力:每一件物品其实只有两个状态,取或者不取,所以可以使用回溯法搜索出所有的情况,那么时间复杂度就是O(2^n),这里的n表示物品数量。 所以暴力的解法是指数级别的时间复杂度。进而才需要动态规划的解法来进行优化! 二维dp数组01背包 确定dp数组及下标含义 dp[i][j]表示前i件物品恰放入一个 阅读全文
posted @ 2024-12-29 11:02 NeroMegumi 阅读(1031) 评论(0) 推荐(0)
摘要:思路 难点 我只想到了:“找一个子集,每个数取或不取求其和,看是否和另一个子集的和相等 ” 但是实际上既然是两个子集相等,那么只要和等于 sum/2 即可了! 取或不取用01背包,但是不知道怎么用。 只有确定了如下四点,才能把01背包问题套到本题上来。 背包的体积为sum / 2 背包要放入的商品( 阅读全文
posted @ 2024-12-29 11:26 NeroMegumi 阅读(71) 评论(0) 推荐(0)
摘要:思路 尽量让石头分成重量相同的两堆,相撞之后剩下的石头最小,这样就化解成01背包问题了。 背包问题: dp定义:dp[i]表示在容量为i的背包最多可放下重量为dp[i]的石头 递推公式:dp[i]=max(dp[i],dp[i-stones[i]]+stones[i]),要么不选当前的石头(沿用遍历 阅读全文
posted @ 2024-12-30 11:06 NeroMegumi 阅读(45) 评论(0) 推荐(0)
摘要:用dp表示总价值 用dp表示组合数 给出一个总数,一些物品,问能否凑成这个总数。 零钱兑换II https://leetcode.cn/problems/coin-change-ii/ 完全背包 二维写法 for (int i = 0; i < weight.size(); i++) { // 遍历 阅读全文
posted @ 2025-01-19 10:24 NeroMegumi 阅读(79) 评论(0) 推荐(1)
摘要:这道题用代码随想录的解释有点牵强,第二层for循环和递推公式也没有说明白。 代码 class Solution { public: bool wordBreak(string s, vector<string>& wordDict) { unordered_set<string> set(wordD 阅读全文
posted @ 2025-01-19 15:54 NeroMegumi 阅读(19) 评论(0) 推荐(0)
摘要:https://www.programmercarl.com/背包总结篇.html#听说背包问题很难-这篇总结篇来拯救你了 阅读全文
posted @ 2025-01-19 16:00 NeroMegumi 阅读(66) 评论(0) 推荐(0)
摘要:这道题目是 打家劫舍 III(House Robber III),是打家劫舍系列问题的变种。问题描述如下: 小偷发现了一个新的区域,这个区域的所有房屋排列类似于一棵二叉树。如果两个直接相连的房屋在同一晚被打劫,房屋会自动报警。给定这棵二叉树的根节点 root,求在不触发警报的情况下,小偷能够盗取的最 阅读全文
posted @ 2025-01-20 12:05 NeroMegumi 阅读(40) 评论(0) 推荐(0)
摘要:https://www.programmercarl.com/动态规划-股票问题总结篇.html#买卖股票的最佳时机含手续费 只能买一次 不断更新最小买入值,不断更新profit=prices[i]-buy 可以买卖多次 动态规划 - 定义dp数组 dp[i][1],dp[i][0]分别表示第i天持 阅读全文
posted @ 2025-01-23 09:39 NeroMegumi 阅读(60) 评论(0) 推荐(0)
摘要:单调栈 要求「从 栈顶 到 栈底 的元素是单调递增(或者单调递减)」。其中满足从栈顶到栈底的元素是单调递增的栈,叫做「单调递增栈」。满足从栈顶到栈底的元素是单调递减的栈,叫做「单调递减栈」。(有的文章是从栈底到栈顶,本文默认从栈顶到栈底) 怎么能想到用单调栈呢? 什么时候用单调栈呢? 通常是一维数组 阅读全文
posted @ 2025-02-05 10:30 NeroMegumi 阅读(20) 评论(0) 推荐(0)
摘要:一、回溯算法能解决如下问题: 组合问题:N个数里面按一定规则找出k个数的集合 排列问题:N个数按一定规则全排列,有几种排列方式 切割问题:一个字符串按一定规则有几种切割方式 子集问题:一个N个数的集合里有多少符合条件的子集 棋盘问题:N皇后,解数独等等 二、回溯法的模板: void backtrac 阅读全文
posted @ 2025-02-11 11:20 NeroMegumi 阅读(11) 评论(0) 推荐(0)