![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
力扣
for
essenge
顺势而为
展开
-
最佳买卖股票时机含冷冻期
用 f[i]f[i]f[i]表示第 iii 天结束之后的「累计最大收益」由于最多只能同时买入(持有)一支股票,并且卖出股票后有冷冻期的限制,因此会有三种不同的状态:目前持有一支股票,对应的「累计最大收益」记为 f[i][0]f[i][0]f[i][0];目前不持有任何股票,并且处于冷冻期中,对应的「累计最大收益」记为 f[i][1]f[i][1]f[i][1];目前不持有任何股票,并且不处于冷冻期中,对应的「累计最大收益」记为 f[i][2]f[i][2]f[i][2]。int maxProfit(原创 2021-05-05 16:57:25 · 74 阅读 · 0 评论 -
粉刷房子
1.动态规划 int minCost(vector<vector<int>>& costs) { int n=costs.size(); if(n==0) return 0; for(int i=n-2;i>=0;i--){ costs[i][0]+=min(costs[i+1][1],costs[i+1][2]); costs[i][1]+=min(costs[i+1][0],costs[i+1.原创 2021-05-05 12:35:39 · 68 阅读 · 0 评论 -
126单词接龙2
相较于单词接龙1,此题主要难点在于记录路径。BFS适合找最短的深度,但是无法记录路径。class Solution {public: int ladderLength(string beginWord, string endWord, vector<string>& wordList) { unordered_set<string> wordSet(wordList.begin(),wordList.end()); if(word原创 2021-02-10 10:55:23 · 91 阅读 · 0 评论 -
388文件的最长绝对路径
输入:input = “dir\n\tsubdir1\n\t\tfile1.ext\n\t\tsubsubdir1\n\tsubdir2\n\t\tsubsubdir2\n\t\t\tfile2.ext”输出:32解释:存在两个文件:“dir/subdir1/file1.ext” ,路径长度 21“dir/subdir2/subsubdir2/file2.ext” ,路径长度 32返回 32 ,因为这是最长的路径用stringstream+getline以’\n’为分割符分割字符串为若干行。建原创 2021-02-09 13:22:37 · 68 阅读 · 0 评论 -
494目标和
1.递归class Solution {public: int count=0; int findTargetSumWays(vector<int>& nums, int S) { calculate(nums,0,0,S); return count; } void calculate(vector<int> nums,int i,int sum,int S){ if(i==nums.siz原创 2021-02-09 10:16:19 · 69 阅读 · 0 评论 -
293 翻转游戏
你和朋友玩一个叫做「翻转游戏」的游戏,游戏规则:给定一个只有 + 和 - 的字符串。你和朋友轮流将 连续 的两个 “++” 反转成 “–”。 当一方无法进行有效的翻转时便意味着游戏结束,则另一方获胜。请你写出一个函数,来计算出第一次翻转后,字符串所有的可能状态。示例:输入: s = “++++”输出:[“–++”,“+ --+”,“++ --”]1.字符串操作class Solution {public: vector<string> generatePossib原创 2021-02-06 12:21:53 · 148 阅读 · 0 评论 -
313超级丑数
编写一段程序来查找第 n 个超级丑数。超级丑数是指其所有质因数都是长度为 k 的质数列表 primes 中的正整数。示例:输入: n = 12, primes = [2,7,13,19]输出: 32解释: 给定长度为 4 的质数列表 primes = [2,7,13,19],前 12 个超级丑数序列为:[1,2,4,7,8,13,14,16,19,26,28,32] 。首先我们知道丑数是基于(过去的丑数)和(质因子数组中质因子)的乘积中的最小值。采用最小优先队列实现最小值排在第一个。使用优先级原创 2021-02-06 11:50:26 · 63 阅读 · 0 评论 -
333最大BST子树
给定一个二叉树,找到其中最大的二叉搜索树(BST)子树,并返回该子树的大小。其中,最大指的是子树节点数最多的。二叉搜索树(BST)中的所有节点都具备以下属性:左子树的值小于其父(根)节点的值。右子树的值大于其父(根)节点的值。注意:子树必须包含其所有后代。进阶:你能想出 O(n) 时间复杂度的解法吗?示例:输入:root = [10,5,15,1,8,null,7]输出:3解释:本例中最大的 BST 子树是高亮显示的子树。返回值是子树的大小,即 3 。1.遍历class Solu原创 2021-02-04 14:15:42 · 240 阅读 · 0 评论 -
325 和等于k的最长子数组长度
class Solution {public: int maxSubArrayLen(vector<int>& nums, int k) { int size = nums.size(); int sum = 0; int ans = 0; map<int,int>prefix; prefix[0] = 0; for(int i=0;i<size;i++){原创 2021-02-04 13:44:21 · 69 阅读 · 0 评论 -
291. 单词规律 II
给你一种规律 pattern 和一个字符串 str,请你判断 str 是否遵循其相同的规律。这里我们指的是 完全遵循,例如 pattern 里的每个字母和字符串 str 中每个 非空 单词之间,存在着 双射 的对应规律。双射 意味着映射双方一一对应,不会存在两个字符映射到同一个字符串,也不会存在一个字符分别映射到两个不同的字符串。示例:输入:pattern = “abab”, s = “redblueredblue”输出:true解释:一种可能的映射如下:‘a’ -> “red”‘b’原创 2021-02-04 11:12:42 · 125 阅读 · 0 评论 -
694不同岛屿的数量
给定一个非空 01 二维数组表示的网格,一个岛屿由四连通(上、下、左、右四个方向)的 1 组成,你可以认为网格的四周被海水包围。请你计算这个网格中共有多少个形状不同的岛屿。两个岛屿被认为是相同的,当且仅当一个岛屿可以通过平移变换(不可以旋转、翻转)和另一个岛屿重合。示例 :11011100000000111011给定上图,返回结果 3 。注意:111和111是不同的岛屿,因为我们不考虑旋转、翻转操作。1.DFS搜索到所有岛屿,并且存储其profile,然后sort排序uniqu原创 2021-02-04 10:30:55 · 122 阅读 · 0 评论 -
1087花括号展开
我们用一个特殊的字符串 S 来表示一份单词列表,之所以能展开成为一个列表,是因为这个字符串 S 中存在一个叫做「选项」的概念:单词中的每个字母可能只有一个选项或存在多个备选项。如果只有一个选项,那么该字母按原样表示。如果存在多个选项,就会以花括号包裹来表示这些选项(使它们与其他字母分隔开),例如 “{a,b,c}” 表示 [“a”, “b”, “c”]。例子:"{a,b,c}d{e,f}" 可以表示单词列表 [“ade”, “adf”, “bde”, “bdf”, “cde”, “cdf”]。请你按字原创 2021-02-04 10:12:18 · 339 阅读 · 0 评论 -
261以图判树
树:连通无回路的图判断一个图是否为树结构就是判断这个图是否有环,如果无环且连同分量为1,则是树结构1.BFSclass Solution {public: bool validTree(int n, vector<vector<int>>& edges) { vector<vector<int>> graph(n,vector<int>(n)); for(int i=0;i<edges.原创 2021-02-03 14:19:42 · 330 阅读 · 0 评论 -
695岛屿的最大面积
1.深搜(沉岛)class Solution {public: int maxAreaOfIsland(vector<vector<int>>& grid) { int ans=0; for(int i=0;i<grid.size();i++){ for(int j=0;j<grid[0].size();j++){ ans=max(ans,dfs(grid,i,j)原创 2021-02-03 12:29:18 · 58 阅读 · 0 评论 -
199二叉树的右视图
1.广搜class Solution {public: vector<int> rightSideView(TreeNode* root) { if(root==nullptr) return {}; vector<int> res; queue<TreeNode*> q; q.push(root); while(!q.empty()){ int size.原创 2021-02-03 12:13:09 · 54 阅读 · 0 评论 -
413等差数列划分
1.暴力class Solution {public: int numberOfArithmeticSlices(vector<int>& A) { if(A.size()<3) return 0; int count=0; for(int s=0;s<A.size()-2;s++){ int d=A[s+1]-A[s]; for(int e=s+2;e<A.si原创 2021-02-03 11:12:31 · 61 阅读 · 0 评论 -
1186 删除一次得到子数组最大和
我理解的此题动态规划:考察以arr[i]为结尾的删除和不删除的两种情况,注意这里不是考察区间[0,i]而是以arr[i]为结尾class Solution {public: int maximumSum(vector<int>& arr) { vector<vector<int>> dp(arr.size(),vector<int>(2)); dp[0][0]=arr[0]; dp[0][1原创 2021-02-03 10:48:19 · 79 阅读 · 0 评论 -
42接雨水
1.暴力class Solution {public: int trap(vector<int>& height) { int ans = 0; int size = height.size(); for(int i=1;i<size-1;i++){ int max_left=0,max_right=0; for(int j=i;j>=0;j--){原创 2021-02-03 10:09:09 · 54 阅读 · 0 评论 -
10正则表达式匹配
以一个例子详解动态规划转移方程:S = abbbbcP = ab* d*c当 i, j 指向的字符均为字母(或 ‘.’ 可以看成一个特殊的字母)时,只需判断对应位置的字符即可,若相等,只需判断 i,j 之前的字符串是否匹配即可,转化为子问题 f[i-1][j-1].若不等,则当前的 i,j 肯定不能匹配,为 false.如果当前 j 指向的字符为 ’ ***’,则不妨把类似 ‘a *’, ‘b *’ 等的当成整体看待。本质上只会有两种情况:匹配 S 末尾的一个字符,将该字符扔掉,而该组合还原创 2021-02-03 09:46:31 · 119 阅读 · 1 评论 -
254 因子的组合
class Solution{ public: vector<vector<int> > dfs(int n,int l){ vector<vector<int> > res; for(int i=l;i*i<=n;i++){ if(n%i==0){ res.push_back({i,n/i});原创 2021-02-02 19:48:07 · 99 阅读 · 0 评论 -
255验证前序遍历序列二叉搜索树
二叉搜索树的前序遍历有以下特点:如果出现递减序列,则是左子树,否则是右子树;右子树一定是递增的综上,我们可以通俗理解为“总体递增,局部递减”。class Solution {public: bool verifyPreorder(vector<int>& preorder) { if(preorder.empty()) return true; stack<int> st; int root=INT_MIN;原创 2021-02-02 19:25:05 · 135 阅读 · 0 评论 -
298二叉树最长连续序列
class Solution {public: int longestConsecutive(TreeNode* root) { return dfs(root,nullptr,0); } int dfs(TreeNode* p,TreeNode* parent,int length){ if(!p) return length; length = (parent&&p->val==parent->val+原创 2021-02-02 19:10:59 · 103 阅读 · 0 评论 -
256 粉刷房子
1.构树class Solution {public: int min3(int a,int b,int c){ return min(min(a,b),c); } int minCost(vector<vector<int>>& costs){ if(costs.size()==0) return 0; if(costs.size()==1) { return min3(co原创 2021-02-02 17:13:46 · 64 阅读 · 0 评论 -
243最短单词距离
1.暴力class Solution {public: int shortestDistance(vector<string>& words, string word1, string word2) { int minDistance = words.size(); for(int i=0;i<words.size();i++){ if(words[i]==word1){ for(i原创 2021-02-02 16:25:17 · 83 阅读 · 0 评论