热题HOT100
anieoo
这个作者很懒,什么都没留下…
展开
-
剑指 Offer 19. 正则表达式匹配
原题链接:剑指 Offer 19. 正则表达式匹配 solution:状态表示:dp[i][j]表示s的前i个字符能否和p的前j个字符匹配转移方程: 如果s[i] == p[j]表示s的第i个字符和p的第j个字符相同,因此dp[i][j] = dp[i - 1][j - 1]. 当p[j] == '.'的时候,由于'.'可以表示任何字符所以dp[i][j] = dp[i - 1][j - 1]. 当 p(j) == '*' 时,若 j>=2,dp[i][j]原创 2022-06-30 23:22:28 · 80 阅读 · 0 评论 -
301. 删除无效的括号
原题链接:301. 删除无效的括号solution:dfs + 剪枝首先统计需要删除的无效左括号和右括号 for(int i = 0 ; i < n ; i ++) { if(s[i] == '(') l ++; if(l == 0 && s[i] == ')') r ++; else if(s[i] == ')') l --; }遍历字符串.原创 2022-05-21 09:48:39 · 334 阅读 · 0 评论 -
85. 最大矩形
原题链接:85. 最大矩形solution: 本题和84. 柱状图中最大的矩形_anieoo的博客-CSDN博客思路一样。本题只需要对每一行都求解对应的高度,计算一个最大的矩形,最后所有答案取最大值class Solution {public: int maximalRectangle(vector<vector<char>>& matrix) { int m = matrix.size(); in...原创 2022-05-20 18:19:40 · 98 阅读 · 0 评论 -
32. 最长有效括号
原题链接:32. 最长有效括号solution: 利用栈进行匹配,遍历字符串s时,只有两种情况'('或')'①当s[i]为'('的时候,将其对应的下标存入栈中②当s[i]为')'的时候,将栈顶弹出,相当于有一组有效的括号,若弹出的时候栈为空代表这个位置是一个无效')'括号,标记sta[i]为true.③当遍历玩字符串的时候,若栈不为空,将栈内存储的所有下标i,都标记为true,因为这些都是无效'('class Solution {public: int lo...原创 2022-05-20 17:27:22 · 109 阅读 · 0 评论 -
84. 柱状图中最大的矩形
原题链接:84. 柱状图中最大的矩形solution:暴力做法,每次找到i左右两边第一个小于height[i]的位置计算面积(TLE)时间复杂度: O(n^2) class Solution {public: int largestRectangleArea(vector<int>& heights) { int n = heights.size(); int res = 0; for(i...原创 2022-05-20 17:21:46 · 210 阅读 · 0 评论 -
124. 二叉树中的最大路径和
原题链接:124. 二叉树中的最大路径和solution:递归求解问题:① 最大路径可能是以当前节点值和左右子树的路径和② 函数返回值为以root为根节点的最大路径③ 递归更新最大路径class Solution {public: int res = INT_MIN; //定义返回值 int maxPathSum(TreeNode* root) { countPath(root); return res; } .原创 2022-05-20 12:52:04 · 235 阅读 · 0 评论 -
76. 最小覆盖子串
原题链接:76. 最小覆盖子串solution: 滑动窗口:是Leetcode 438 的升级版438. 找到字符串中所有字母异位词_anieoo的博客-CSDN博客class Solution {public: string minWindow(string s, string t) { unordered_map<char,int> hash; unordered_map<char,int> c...原创 2022-05-19 17:23:05 · 76 阅读 · 0 评论 -
621. 任务调度器
原题链接:621. 任务调度器solution:贪心:统计出每个字母的出现次数,然后把出现次数的大于 0 的次数放入大根堆中。堆中最多有 26 个元素。贪心策略如下:我们按 n + 1 个时间一组来安排任务,重复次数多的任务优先安排。每次从堆中最多取出前 n + 1 个元素,然后这些元素减 1,如果元素仍然大于 0,则放回堆中。每组的时间为 n + 1,如果这是最后一组(即没有再往堆中放回),则这一组的时间为取出的元素个数。class Solutio...原创 2022-05-19 15:53:00 · 105 阅读 · 0 评论 -
146. LRU 缓存
在Linux设备驱动中使用中断,相比单片机裸机开发要简单的多,只需要使用内核提供的API申请和释放中断即可。一、申请中断int request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags, const char *name, void *dev)...原创 2022-05-19 10:53:48 · 133 阅读 · 0 评论 -
399. 除法求值
原题链接:399. 除法求值solution: 图的bfs,a / b = c,无向图相当于存储a 到 b 的距离为c,b 到 a的距离为1 / cclass Solution {public: unordered_set<string> node; unordered_map<string,unordered_map<string,double>> w; double bfs(string a,strin...原创 2022-05-17 22:23:08 · 169 阅读 · 0 评论 -
279. 完全平方数
原题链接:279. 完全平方数solution:动态规划:class Solution {public: int numSquares(int n) { vector<int> dp(n + 1); for(int i = 1;i <= n;i++) { dp[i] = INT_MAX; for(int j = 1;j <= i / j;j++) { ..原创 2022-05-12 15:06:47 · 158 阅读 · 0 评论 -
581. 最短无序连续子数组
原题链接:581. 最短无序连续子数组Solution: 对数组进行排序再和原数组进行比较,当出现无序情况时保留对应坐标class Solution {public: int findUnsortedSubarray(vector<int>& nums) { if(nums.empty() || nums.size() == 1) return 0; int n = nums.size(); ve...原创 2022-05-12 11:19:22 · 100 阅读 · 0 评论 -
437. 路径总和 III
原题链接:437. 路径总和 IIIsolution: 双重递归,一重递归递归遍历节点数,一重递归递归路径和class Solution {public: int res = 0; int pathSum(TreeNode* root, int targetSum) { if(root == nullptr) return 0; dfs(root,targetSum); pathSum(root->le...原创 2022-05-12 10:12:17 · 89 阅读 · 0 评论 -
148. 排序链表
原题链接:148. 排序链表solution: ①先遍历链表,保存每一个节点。O(n) ②sort根据每个节点值进行排序。O(nlog(n)) ③根据新的顺序创建链表。 O(n)总的时间复杂度:nlog(n)class Solution {public: ListNode* sortList(ListNode* head) { vector<ListNode *> L; ...原创 2022-05-11 15:14:56 · 207 阅读 · 0 评论 -
416. 分割等和子集
原题链接:416. 分割等和子集solution:是一道01背包问题.①如果满足分割等和子集,那么所有数字的和一定是偶数。②每个物品的体积为v[i],背包总体积为sum / 2.状态表示:dp[i][j]表示从前i个物品中选择,总体积和为j的集合状态计算:若可以凑出则dp[i][j] = true,否则dp[i][j]为false.以第i件物品举例: dp[i][j] = dp[i - 1][j] || dp[i - 1][j - v[i]]class ...原创 2022-05-11 14:23:15 · 138 阅读 · 0 评论 -
105. 从前序与中序遍历序列构造二叉树
原题链接:105. 从前序与中序遍历序列构造二叉树solution: 二叉树的前序遍历:根左右 二叉树的中序遍历:左根右经过前序遍历和中序遍历的节点数组如下:算法具体步骤: ①前序遍历中的第一个节点就是当前树的根节点 ②在中序遍历中找到根节点的位置pos,根节点左边都是其左子树,右边是其右子树 ③假设在中序遍历数组中左中树的长度为k,则前序遍历数组中根节点后的k个数是左子树 ④根据以上特...原创 2022-05-11 10:37:14 · 176 阅读 · 0 评论 -
309. 最佳买卖股票时机含冷冻期
原题链接:309. 最佳买卖股票时机含冷冻期solution:状态机,本题包含三种状态,如下图所示状态表示:dp[i][0]: 下标i天时,处于冷冻期时时所获得的最大利润。dp[i][1]:下标i天时,持有股票时获得的最大利润dp[i][2]: 下标i天时,卖完股票时所获得的最大利润。状态计算:dp[i][0] = max(dp[i - 1][0],dp[i - 1][2])dp[i][1] = max(dp[i - 1][0] - p[i],dp[i - 1..原创 2022-05-10 18:58:11 · 158 阅读 · 0 评论 -
337. 打家劫舍 III
原题链接:337. 打家劫舍 IIIsolution:树形dp,树形dp只需要考虑一部分局部情况就行.class Solution {public: int rob(TreeNode* root) { vector<int> f = dfs(root); return max(f[0],f[1]); } //dfs返回选和不选root节点的最大值 vector<int> dfs(Tr..原创 2022-05-10 16:09:34 · 91 阅读 · 0 评论 -
538. 把二叉搜索树转换为累加树
原题链接:538. 把二叉搜索树转换为累加树solution: 反向中序遍历+递归class Solution {public: int sum = 0; TreeNode* convertBST(TreeNode* root) { if(root == nullptr) return root; convertBST(root->right); root->val += sum; ...原创 2022-05-10 12:23:45 · 96 阅读 · 0 评论 -
236. 二叉树的最近公共祖先
原题链接:236. 二叉树的最近公共祖先solution:递归进行查找节点p和q,并且给定子树中一定存在p和q函数表示对于当前树的查找已经完毕, 否则对左右子树进行查找, 根据左右子树的返回值判断: 1. 左右子树的返回值都不为nullptr, 由于值唯一左右子树的返回值就是p和q, 此时root为根节点 2. 如果左右子树返回值只有一个不为nullptr, 说明p和q共同存在于当前节点的左子树或右子树中/** * Definition for a.原创 2022-05-10 12:03:59 · 88 阅读 · 0 评论 -
96. 不同的二叉搜索树
原题链接:96. 不同的二叉搜索树solution:一样的题目95. 不同的二叉搜索树 II_anieoo的博客-CSDN博客给定长度固定时,不同二叉搜索树的种类一样。比如:1~10的二叉搜索树的种类和10~20的种类数一样总的二叉搜索树的种类等于左子树的种类*右子树的种类动态规划:dp[i]表示连续长度为i的二叉搜索树的种类状态计算:枚举长度为i中的每个根节点j,dp[i] = dp[j - 1] * dp[i - j]class Solution {.原创 2022-05-10 11:26:56 · 174 阅读 · 0 评论 -
114. 二叉树展开为链表
原题链接:114. 二叉树展开为链表solution: 先序遍历存储节点,再挨个展开class Solution {public: vector<TreeNode *> tree; //存储节点 void Preorder(TreeNode *root,vector<TreeNode *> &tree) { if(root == nullptr) return; tree.push_ba...原创 2022-05-09 23:41:37 · 187 阅读 · 0 评论 -
207. 课程表
原题链接:207. 课程表solution: bfs,用邻接表构建图的关系,最后每次将入度为0的节点存入队列const int N = 1e5 + 10;int e[N],ne[N],h[N],idx,sta[N];class Solution {public: void add(int a,int b) { e[idx] = b; ne[idx] = h[a]; sta[b]++; //保存a有几个入度 ...原创 2022-05-08 09:46:28 · 230 阅读 · 0 评论 -
72. 编辑距离
原题链接:72. 编辑距离solution:动态规划题:动态规划就是实现对暴力搜索的优化,达到用一个数组描述一个集合的存在。现在有两个字符串word1和word2.状态表示:dp[i][j]表示将word1中的前i个字母变成word2中前j的字母的方法的集合属性:求方法数量的最小值min状态计算:以word1中的第i个字母为例子进行分析.①添加操作:在word1中第i个字母后添加一个字母相同,表示在没有添加之前word1中的前i个字母和word2中的前j - 1个字母相同。.原创 2022-05-07 14:27:39 · 188 阅读 · 0 评论 -
23. 合并K个升序链表
原题链接:23. 合并K个升序链表solution: 利用堆维护每个链表的最小值,每次把堆顶元素出堆插入返回链表的尾部,如果出堆节点不是尾节点,就将其再次入堆。时间复杂度:nlogk,n为所有链表总长度,k为堆大小class Solution {public: struct cmp { bool operator()(ListNode *a,ListNode *b) { return a->val > b-&...原创 2022-05-07 10:42:52 · 218 阅读 · 0 评论 -
239. 滑动窗口最大值
原题链接:239. 滑动窗口最大值solution: 滑动窗口模板题i代表窗口的右端点,所以窗口的左端点的位置为i - k + 1队列q[hh]存储的是窗口中最小值对应数组中的位置,因此一旦窗口中最小值的位置小于i - k + 1,就需要将q[hh]移除窗口//若队尾元素的值nums[q[tt]] <= 滑动窗口的右端点nums[i],则为了维护队列q单调递减,需要删除队尾const int N = 1e5 + 10;class Solution ...原创 2022-05-06 12:58:08 · 146 阅读 · 0 评论 -
494. 目标和
原题链接:494. 目标和solution: dfs+回溯class Solution {public: int findTargetSumWays(vector<int>& nums, int target) { return dfs(nums,0,0,target);; } int dfs(vector<int> &nums,int length,int sum,int target)...原创 2022-05-06 10:26:20 · 222 阅读 · 0 评论 -
438. 找到字符串中所有字母异位词
原题链接:438. 找到字符串中所有字母异位词solution:滑动窗口(双指针)//注释写的很清楚了class Solution {public: vector<int> findAnagrams(string s, string p) { unordered_map<char,int> hash; //保存目标串的种类 vector<int> res; //保存返回值 //加入目原创 2022-05-06 00:09:05 · 273 阅读 · 0 评论 -
560. 和为 K 的子数组
原题链接:560. 和为 K 的子数组solution:枚举:题目求解的是和为K的连续子数组,因此从每个区间终点开始向前枚举即可。时间复杂度O(n^2)class Solution {public: int subarraySum(vector<int>& nums, int k) { int n = nums.size(); int res = 0; //定义返回值 for(int i = 0;i .原创 2022-05-05 12:18:55 · 190 阅读 · 0 评论 -
152. 乘积最大子数组
原题链接:152. 乘积最大子数组solution: 动态规划:maxdp[i]维护一个以i结尾的最大乘积子数组mindp[i]维护一个以i结尾的最大乘积子数组为什么需要维护两个数组? 因为本题考虑的是乘积,负数乘负数可以变成正数,而正数乘以负数可以变成负数,因此需要考虑num[i]为正数或负数的两种情况。转移方程:maxDP[i + 1] = max(maxDP[i] * A[i + 1], A[i + 1],minDP[i] * A[i + 1])min...原创 2022-05-05 10:56:14 · 386 阅读 · 0 评论 -
215. 数组中的第K个最大元素
原题链接:215. 数组中的第K个最大元素solution: 快速选择算法class Solution {public: int quick_select(vector<int>& nums,int l,int r,int k) { if(l >= r) return nums[l]; //终止条件 int x = nums[(l + r) >> 1]; int i = l - 1,j = r.原创 2022-05-04 19:30:18 · 167 阅读 · 0 评论 -
406. 根据身高重建队列
原题链接:406. 根据身高重建队列solution: 贪心思路:身高高的人只会看到比他高的人,所以当身高高的人固定好了位置,前面插入多少个矮的人都不会破坏高的人的条件限制。所以应该先决定高的人的位置,再决定矮的人的位置;高的人限制条件少,矮的人限制条件多。①先按身高从大到小排序,身高一样则按照k排序:身高大或k小意味着限制条件少,应该被优先考虑。②依次插入元素:由上一点,先进入res的元素不会被后进入的元素影响,因此每一次插入只需要考虑自己不需要考虑别人。当遍历到元素[a,b]的时候.原创 2022-05-04 20:56:18 · 222 阅读 · 0 评论 -
394. 字符串解码
原题链接:394. 字符串解码solution: 递归:dfs返回字符串s中从位置u开始解码后的结果class Solution {public: string decodeString(string s) { int u = 0; return dfs(s,u); } string dfs(string s,int &u) //递归 { string res; wh...原创 2022-05-04 15:13:25 · 145 阅读 · 0 评论 -
739. 每日温度
原题链接:739. 每日温度solution: 暴力做法:时间复杂度O(n^2)超时class Solution {public: vector<int> dailyTemperatures(vector<int>& temperatures) { int n = temperatures.size(); vector<int> res; //定义返回值 for...原创 2022-05-04 14:26:59 · 214 阅读 · 0 评论 -
221. 最大正方形
原题链接:347. 前 K 个高频元素solution: 朴素做法,先计算每个数字出现的次数,在根据出现次数进行排序,最后输出,时间复杂度sort(nlogk),k为vector中元素个数,最坏情况nlogn,每个元素出现1次class Solution {public: typedef pair<int,int> PII; vector<int> topKFrequent(vector<int>& nums, i...原创 2022-05-04 12:21:04 · 127 阅读 · 0 评论 -
347. 前 K 个高频元素
原题链接:347. 前 K 个高频元素solution: 朴素做法,先计算每个数字出现的次数,在根据出现次数进行排序,最后输出,时间复杂度sort(nlogk),k为vector中元素个数,最坏情况nlogn,每个元素出现1次class Solution {public: typedef pair<int,int> PII; vector<int> topKFrequent(vector<int>& nums, ...原创 2022-05-04 12:16:51 · 110 阅读 · 0 评论 -
238. 除自身以外数组的乘积
原题链接:238. 除自身以外数组的乘积solution: 暴力法:时间复杂度O(n^2)肯定会超时class Solution {public: vector<int> productExceptSelf(vector<int>& nums) { vector<int> res; //定义返回值 int n = nums.size(); for(int i = 0;...原创 2022-05-03 10:24:49 · 380 阅读 · 0 评论 -
322. 零钱兑换
原题链接:322. 零钱兑换solution:一道完全背包问题模板题,amount相当于背包的体积,coins保存各个物品的体积,每个物品可以使用无限次,并且每个物品的价值为1,求解能塞满背包的最小价值。状态表示:dp[i][j]:表示从前i个纸币中选,满足纸币总额为j的最小值的集合状态计算: dp[i][j] = min(dp[i - 1][j],dp[i - 1][j - coins[i]] + 1,dp[i - 1][j - 2 * coins[i]] ...原创 2022-05-03 09:29:16 · 161 阅读 · 0 评论 -
300. 最长递增子序列
原题链接:300. 最长递增子序列solution: 动态规划://动态规划//dp[i]表示以i为结尾的最长上升子序列//转移方程:dp[i]=max(dp[1]+1,dp[2]+1,dp[3]+1.....,dp[i-1]+1)class Solution {public: //动态规划 //dp[i]表示以i为结尾的最长上升子序列 //转移方程:dp[i] = max(dp[1] +...原创 2022-04-30 15:06:51 · 293 阅读 · 0 评论 -
64. 最小路径和
原题链接:64. 最小路径和solution: 动态规划:dp[i][j] = min(dp[i - 1][j],dp[i][j - 1]) + grid[i - 1][j - 1])class Solution {public: int minPathSum(vector<vector<int>>& grid) { int m = grid.size(); int n = grid[0].size(...原创 2022-04-30 10:57:18 · 235 阅读 · 0 评论