随笔分类 -  LeetCode

LeetCode题解
摘要:可以枚举所有的运算符的位置,然后递归算出该运算符左右的表达式所有可能的取值,然后对所有可能的取值进行计算。 首先,我们需要把原字符串input中的所有数字和运算符都放到一个vector里,因为每个数字的长度不确定,所以放到 vector里方便我们进行计算。 然后写一个计算expr某段区间的所有表达式 阅读全文
posted @ 2020-08-21 14:43 machine_gun_lin 阅读(203) 评论(0) 推荐(0)
摘要:给定二维矩阵,搜索是否存在目标值target,暴力做法可以两重循环遍历数组进行搜索,这样时间复杂度是O(rows * cols), 其中rows,cols为二维矩阵matrix的行数和列数。 我们可以用给定的性质进行优化,因为每行的元素从左到右升序排列,每列的元素从上到下升序排列。 所以我们可以从右 阅读全文
posted @ 2020-08-21 12:44 machine_gun_lin 阅读(109) 评论(0) 推荐(0)
摘要:暴力做法:可以在遍历数组的时候,当i-k+1>=0(表示当前滑动窗口的大小达到了k),就遍历i-k+1 ~ i的所有元素,寻找最大值, 然后把最大值压入到结果数组res中,显然这种做法需要两重循环,时间复杂度为O(n*k)。 我们考虑一下优化,暴力做法在遍历数组的时候还需要在内层循环遍历来计算当前窗 阅读全文
posted @ 2020-08-21 12:17 machine_gun_lin 阅读(115) 评论(0) 推荐(0)
摘要:要求出某个数除自身以外的数组的乘积,就要求出这个数前面所有数的乘积和这个数后面的所有数的乘积。 求出这个数前面或者后面所有数的乘积可以用前缀和或者后缀和对数组元素进行连续的乘积得到,但是由于这题限制了我们 只能开一个数组(最后的返回数组),所以前缀和用了数组记录之后,后缀和不能再用数组了。 不过没关 阅读全文
posted @ 2020-08-21 11:02 machine_gun_lin 阅读(107) 评论(0) 推荐(0)
摘要:这题给出的节点是要删除的节点,而不是要删除的节点的前驱节点,所以,如果直接把这个节点删掉的话,单链表就断掉了, 没办法,所以不能动这个要删除的节点,不过我们可以动这个要删除的节点的下一个节点,但是下一个节点不是我们要删除的节点, 因为他的值我们需要保留,正好我们可以把我们现在指向的节点node的值修 阅读全文
posted @ 2020-08-21 10:40 machine_gun_lin 阅读(71) 评论(0) 推荐(0)
摘要:对情况进行分类: (1)如果root为空,则返回NULL; (2)如果p和q其中之一为root,则这个节点就是最近公共祖先,返回root; 其他情况下,p和q有可能都在root的左子树、都在root的右子树、或者左右子树各一个; (3)递归计算lowestCommonAncestor(root → 阅读全文
posted @ 2020-08-21 10:34 machine_gun_lin 阅读(83) 评论(0) 推荐(0)
摘要:二叉搜索树的性质:(1)root为空;(2)或者root左子树中所有元素都小于root->val,root右子树中所有元素都大于root->val, 且root的左右子树也是二叉搜索树。 所以要找两个节点的最近公共祖先,有三种情况: (1)p,q都在root的左子树中,则我们到root的左子树去寻找 阅读全文
posted @ 2020-08-21 10:19 machine_gun_lin 阅读(84) 评论(0) 推荐(0)
摘要:第一题 1539. 第 k 个缺失的正整数 用一个数组missed记录从小到大、所有arr数组缺失的正整数可以把所有出现过的元素放入一个set里,然后从 1~2000开始枚举(因为arr长度和k的大小最大都是1000,所以答案一定小于2000),如果当前枚举到的这个数在 set中没有出现,说明arr 阅读全文
posted @ 2020-08-19 23:47 machine_gun_lin 阅读(178) 评论(0) 推荐(0)
摘要:第一题 1544. 整理字符串 简单模拟,用一个字符串res记录结果,然后遍历原字符串,如果res为空或者当前字母与res的最后一个字母不是同一个字母的大小写形式, 就把当前字母加入到res字符串中,否则,删除res的最后一个字母。 class Solution { public: string m 阅读全文
posted @ 2020-08-17 23:23 machine_gun_lin 阅读(267) 评论(0) 推荐(0)
摘要:第一题 5185. 存在连续三个奇数的数组 class Solution { public: bool threeConsecutiveOdds(vector<int>& arr) { int size = arr.size(); for(int i = 0; i + 2 < size; ++i) 阅读全文
posted @ 2020-08-16 23:53 machine_gun_lin 阅读(144) 评论(0) 推荐(0)
摘要:套一个快速排序的模板,然后返回第k大的元素即可。 代码如下: class Solution { public: void quick_sort(vector<int> &nums, int l, int r) { //快速排序nums数组的[l ~ r]部分,细节分析看上面的链接 if(l >= r 阅读全文
posted @ 2020-08-15 17:54 machine_gun_lin 阅读(136) 评论(0) 推荐(0)
摘要:这题是LeetCode198. 打家劫舍的进阶版,除了要求不能 打劫相邻的房子以外,还不能同时打劫第一个和最后一个房子。因为所有房子的排列是环形的,所以实际上第一个房子和 最后一个房子也是相邻的。 我们也用dp[i]表示打劫到第i个房子能获得的最大收益,要打劫到最后一个房子,就得不打劫第一个房子,所 阅读全文
posted @ 2020-08-14 20:33 machine_gun_lin 阅读(79) 评论(0) 推荐(0)
摘要:这题是LeetCode79. 单词搜索的进阶版,第79题是在二维的char数组里搜索单个单词, 这题需要在二维char数组里搜索一组单词。 理论上只需要对遍历单词数组,逐个套用79的dfs方法即可,不过这题题目要求了需要用Trie树做优化。 所以,我们最开始可以把单词列表里的所有单词都插入到一个Tr 阅读全文
posted @ 2020-08-14 15:14 machine_gun_lin 阅读(173) 评论(0) 推荐(0)
摘要:这题和LeetCode208. 实现 Trie (前缀树)一样,都是实现Trie树, 支持字符串的插入和查找,只不过这里的查找需要支持正则表达式,也就是可以用'.'代替任何单词,所以我们需要在查找部分做一些修改, 插入单词部分和208题一样。 对于查找单词,由于需要支持正则表达式,所以在查找单词wo 阅读全文
posted @ 2020-08-13 17:39 machine_gun_lin 阅读(156) 评论(0) 推荐(0)
摘要:这题和LeetCode207. 课程表一样,都是拓扑排序的模板题,只不过207题只需判断是否存在拓扑序列, 这题要返回拓扑序列。 只需要在BFS时在一个结果数组中记录每个入队的元素即可,最后判断数组大小是否和课程总数量numCourses相同,相同就返回我们记录的所有元素的入队顺序的数组res, 不 阅读全文
posted @ 2020-08-13 16:48 machine_gun_lin 阅读(87) 评论(0) 推荐(0)
摘要:LeetCode209. 长度最小的子数组 方法一 暴力枚举所有可能的子数组,也就是枚举子数组的所有开始下标和结束下标,计算子数组的和,如果子数组的和小于等于s,就更新最小长度。 class Solution { public: int minSubArrayLen(int s, vector<in 阅读全文
posted @ 2020-08-13 16:16 machine_gun_lin 阅读(77) 评论(0) 推荐(0)
摘要:方法一 可以直接用一个数组trie存放所有插入的字符串,然后insert和startsWith操作只需要遍历trie数组,逐个判断即可。 代码: class Trie { public: vector<string> trie; /** Initialize your data structure 阅读全文
posted @ 2020-08-13 16:09 machine_gun_lin 阅读(116) 评论(0) 推荐(0)
摘要:这题是拓扑排序的模板题。 先看一下拓扑排序的步骤: (1)遍历存放所有点之间的依赖关系的数组(这题是prerequisities数组),统计所有入度为0的节点,即没有任何先修课程的课程。 (2)有一个队列存放所有的点(入队顺序表示学习课程的顺序),将所有入度为0的节点入队。 然后进行BFS,不断取出 阅读全文
posted @ 2020-08-13 14:17 machine_gun_lin 阅读(125) 评论(0) 推荐(0)
摘要:状态机dp,可以参考LeetCode188. 买卖股票的最佳时机 IV。 我们有两个状态,当前交易的天数i和当前是否持有股票,我们用一个二维数组dp[n][2]表示各个状态所能获得的最大收益(其中n为prices数组的大小,表示交易的天数)。 比如dp[i][0]表示第i天(i从0开始),当前不持有 阅读全文
posted @ 2020-08-08 22:04 machine_gun_lin 阅读(132) 评论(0) 推荐(0)
摘要:状态机dp,可以参考LeetCode188. 买卖股票的最佳时机 IV. 我们可以用一个数组dp[n][2]表示每一个状态下的最高收益(其中n是prices数组的大小,即总的天数)。 数组的第一维表示天数,第二维表示持有或不持有股票(1表示持有,0表示不持有)能获得的最大收益。 比如dp[i][0] 阅读全文
posted @ 2020-08-08 17:24 machine_gun_lin 阅读(67) 评论(0) 推荐(0)