![](https://img-blog.csdnimg.cn/20190918140053667.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
leetcode
leetcode 刷题
sorry_maker
博客只图一乐,主要是给我自己看的,不要轻信,有问题欢迎留言
展开
-
978.最长湍流子数组
问题描述思路求最值问题,不用输出具体的结果,只需要输出长度,那么就可以使用动态规划,确定了方法,就可以根据方法的模板来写。首先确定状态,这里的dp数组为2行n列dp[0][j]表示以第j个数字为结尾的,且当前为升序列,也就是第j个数大于第j-1个数。dp[1][j]表示以第j个数字为结尾的,且当前为降序列,也就是第j个数小于第j-1个数。第一行代表状态为升,第二行代表状态为减那么就有了状态转移方程:如果当前状态为升,那么dp[0][j]=dp[1][j-1]+1;如果当前状态为降,那么原创 2020-11-20 16:50:46 · 118 阅读 · 0 评论 -
LeetCode51N皇后问题 回溯算法
问题描述思路最暴力的解法就是在棋盘上把所有的位置都遍历一遍,并判断当前位置能否放皇后……那么此题就可以递归回溯算法,用递归,首先就要确定递归的参数,void getQueens(int n,int index,vector & row)n代表皇后的个数,index表示当前考虑将皇后放到第index行,row[i]=k,表示第i行的第k列放了皇后。其次,此题的关键就是判断当前位置能不能放皇后,这里有一定的技巧性,我定义了以下向量来存储vector col,dia1,dia2;**原创 2020-11-09 17:30:12 · 180 阅读 · 0 评论 -
417太平洋大西洋水流问题
问题描述思路采用逆向思维,从数组的最外边开始遍历,向数组中心开始遍历,如果太平洋和大西洋都被访问过,那么当前节点就就符合题目条件。代码class Solution { int m,n;public: int changePos[4][2]={{1,0},{0,1},{-1,0},{0,-1}}; bool isEffective(int x,int y) { if(x>=0&&x<m&&y>=0&&原创 2020-11-06 11:46:17 · 105 阅读 · 0 评论 -
leetcode 130被围绕的区域 回溯算法
问题描述对不起,我是fw,看官方解答吧class Solution {public: int n, m; void dfs(vector<vector<char>>& board, int x, int y) { if (x < 0 || x >= n || y < 0 || y >= m || board[x][y] != 'O') { return; }原创 2020-11-03 17:28:59 · 132 阅读 · 0 评论 -
leetcode 200岛屿数量
问题描述代码class Solution {private: vector <vector <bool> >visited; int m,n; int move[4][2]={{-1,0},{0,1},{1,0},{0,-1}}; bool effective(int x,int y) { if(x>=0&&x<=m-1&&y>=0&&y<=n-1) re原创 2020-11-02 11:11:09 · 112 阅读 · 0 评论 -
leetcode79单词搜索回溯算法
问题描述思路代码class Solution {private: vector <vector <bool>> isVisited; int m,n; int position[4][2]={{-1,0},{0,1},{1,0},{0,-1}}; bool canMove(int x,int y){ if(x>=0&&x<m&&y>=0&&y<n) re原创 2020-11-01 11:17:52 · 103 阅读 · 0 评论 -
LeetCode401二进制手表回溯算法
问题描述思路1.读懂题意,把题目尽可能抽象成“子集、排列、组合”类型问题本题的题目总结而言就是:有十盏灯,我分别给他编号0-9,号码0-3代表小时,号码4-9代表分钟。这就是一个典型的组合问题,说白了就是从10个数字中挑选n个组合起来。代码class Solution { unordered_map <int,int> h={{0,1},{1,2},{2,4},{3,8},{4,1},{5,2},{6,4},{7,8},{8,16},{9,32}}; vector原创 2020-10-31 15:20:25 · 229 阅读 · 0 评论 -
leetcode 90子集2 回溯算法
问题描述思路首先明确这是一个组合问题,原创 2020-10-31 10:35:19 · 98 阅读 · 0 评论 -
递归LeetCode 78子集
问题描述代码class Solution {public: vector<int> t; vector<vector<int>> ans; void getSubsets(int cur, vector<int>& nums) { if (cur == nums.size()) { ans.push_back(t); return; }原创 2020-10-31 10:22:26 · 90 阅读 · 0 评论 -
回溯算法LeetCode216组合求和3
问题描述思路分析首先确定这是一个什么问题,很明显,输出的结果不需要考虑顺序,那就是一个组合问题,组合问题的start并不总是从0开始,会随着递归的推进而改变,注意的事项就是这么多。然后根据树状图来解就行了。代码class Solution { vector <vector <int> > res; void getCombunation(int start,int k,int n,vector <int> &p) {原创 2020-10-27 15:33:15 · 114 阅读 · 0 评论 -
LeetCode47全排列二 回溯算法
问题描述代码class Solution { vector <vector <int> > res; vector <bool> isVisited; void getPermute(vector <int>&nums,int index,vector <int>& p) {//关于参数的引用问题,因为本题中每一次回溯,p都会删除一个元素, //所以返回的时候p是和函数调用的时候是一样的原创 2020-10-25 10:40:47 · 82 阅读 · 0 评论 -
回溯算法 LeetCode 131 分割回文子串
问题描述思路在写题时,如果题目是要求枚举所有的情况,那么首先就要考虑递归,因为递归本身就会回溯,但根据不同的题目,在考虑时,就要注意递归的参数是否要和递归本身一样进行回溯,这也是回溯的难点和重点。如果状态容易储存,就可以考虑动态规划的方法来接,但像是本题一样的要求列举所有的到的解时,就用回溯法吧。确定好方法之后,那接下来就是画出树状图了,然后根据树状图来进行解答。代码class Solution { vector <vector <string>> res;原创 2020-10-24 20:34:16 · 166 阅读 · 0 评论 -
LeetCode 动态规划72编辑距离
问题描述思路求最值,动态规划问题,首先是确定状态,一般在两个字符串上进行的操作,dp就为二维数组,i,j分别表示考虑word1,word2从0到i,j字符串。状态方程在这里,建议拿纸笔模拟一下,很容易就可以得到代码class Solution {public: int min3(int a,int b,int c) { return min(a,min(b,c)); } int minDistance(string word1, string word原创 2020-10-22 22:10:28 · 80 阅读 · 0 评论 -
leetcode 动态规划494目标和
问题描述思路这是一道关于选择的题目,也就是对于每一个数,都有选+还是选-两种选择。首先确定状态,设数组的位置为变量i,表示考虑数组的第0到i的数,target的数值为j很容易就可以找出状态方程dp[i][j]=dp[i-1][j-nums[i]]+dp[i-1][j+nums[i]];当然要注意边界情况然后这个题目很容易犯错的一点就是,二维数组的列要开所有元素和的两倍加1那么大,表示target从-sum到sum。而且当S大于sum的时候,是没有解的。代码class Solution {原创 2020-10-22 21:11:46 · 117 阅读 · 0 评论 -
LeetCode 动态规划139单词拆分
问题描述思路状态:dp[i]表示考虑0到i-1所表示的字符串可不可以被拆分成单词状态转移方程在程序中有,不难理解代码class Solution {public: bool wordBreak(string s, vector<string>& wordDict) { int n=s.size(); vector <bool> dp(n+1,false); unordered_set <string&原创 2020-10-22 19:04:40 · 123 阅读 · 0 评论 -
leetcode 474 1和0
问题描述思路分析求最值问题,并且需要考虑所有的情况,所以可以用动态规划来写。题中是要选出最大的子集,首先,明确状态,dp[i][j][k]表示考虑第strs[0]到strs[i],0的个数为j,1的个数为k的最大子集。对应每一个字符串,就有选还是不选的问题。所以状态方程是dp[i][j][k]=max(dp[i-1][j][k](不选),dp[i-1][j-num0][k-num1]+1(选));然后还有一个步骤就是初始化的问题,那就是考虑第一个字符串对应的dp数组应该如何写,具体见代码代码原创 2020-10-20 16:36:30 · 76 阅读 · 0 评论 -
LeetCode377组合总和4
问题描述状态转移方程为当数组不越界的情况下(i-nums[j]>=0)dp[i]=sum(dp[i-nums[j]]);代码class Solution {public: int combinationSum4(vector<int>& nums, int target) { int n=nums.size(); if(target<=0||n==0) return 0; vector <unsign原创 2020-10-20 14:59:17 · 85 阅读 · 0 评论 -
LeetCode 动态规划322零钱兑换
问题描述思路根据题意,最暴力的方法就是枚举所有的情况,并且是求最值问题,所以就可以想到用动态规划的方法进行求解代码class Solution {public: int coinChange(vector<int>& coins, int amount) { int n=coins.size(); if(amount==0) return 0; if(n==1&&amount%coins[0]!=0)原创 2020-10-20 14:28:00 · 86 阅读 · 0 评论 -
leetcode 416.分割等和子集
问题描述思路本题可以看做能否将n个物体放入容量恰好为sum/2的背包中,是一个典型的背包问题状态转移方程为如果当前物体(第i个)可以放得下,也就是if(sums[i]<=c)dp[i][c]=(dp[i-1][c]||dp[i-1][c-sums[i]]);即考虑0到i个物品能不能恰好放入容量为c的背包,就要考虑第i个物品放还是不放,如果放,那就是考虑0到i-1个物品能不能恰好放入容量为c-sums[i]的背包,,如果不放,就考虑能否将0到i-1个物品能不能恰好放入容量为c的背包。如果原创 2020-10-16 11:07:01 · 54 阅读 · 0 评论 -
LeetCode113路径总和2递归 二叉树
问题描述代码/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: vector<vector<in原创 2020-09-26 17:20:55 · 83 阅读 · 0 评论 -
*leetcode257二叉树的所有路径递归
代码/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: vector<string> binary.原创 2020-09-26 16:58:32 · 66 阅读 · 0 评论 -
*LeetCode递归 二叉树404左叶子之和
问题描述代码实现/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: int sumOfLeftLeaves(原创 2020-09-26 16:46:27 · 140 阅读 · 0 评论 -
LeetCode 121 买卖股票的最佳时期 动态规划
问题描述思路要遍历所有的情况,并且有重叠子问题,就可以考虑使用动态规划的思想来求解1.首先就是确定dp[i]该表示什么,本题就按照题目意思来,表示第i天以前的最大利润2.状态方程 本题为 dp[i]=max(dp[i−1],prices[i]−minprice),第i天要么什么都不做,要么在第i天卖出股票,所得的利润才可能是最大的3.初始化 dp[0]=0;代码代码class Solution {public: int maxProfit(vector<int&g原创 2020-09-21 19:02:09 · 73 阅读 · 0 评论 -
动态规划LeetCode309最佳买卖股票时期含冷冻期
问题描述思路读完题目,就知道要求出所有可能的情况,可以使用递归。然后可以发现递归求解过程中会有重叠子问题,所以就采用动态规划的方法。用一个二维数组来保存状态。总共三列,第一列表示持有股票,第二列表示未持有股票且处于冷冻期,第三列表示未持有股票且未处于冷冻期,dp[i]表示这天结束后的最大收益,每个dp[i]只与昨天也就是dp[i-1]有关。不难理解,只要昨天对应的三种状态的收益是最大的,在这个基础上进行相关操作,就能确保今天的收益是最大的代码class Solution {public:原创 2020-09-21 11:03:13 · 115 阅读 · 0 评论 -
LeetCode 213 打家劫舍 动态规划
问题描述该题就是在打家劫舍1的基础上增加了一个条件,就相当于求两次打家劫舍1,因为要想偷得钱最多,就要分两种情况:在第一个和最后一个中选择哪个(两个都不选的舍去,那肯定不是最大的)偷到的钱是最多的;代码class Solution {public: int f(vector <int> &nums,int s,int e)//相当于打家劫舍1 { vector <int> dp(nums.size()); dp[s]=原创 2020-09-20 20:46:13 · 67 阅读 · 0 评论 -
动态规划LeetCode 337打家劫舍3
问题描述题解我曾试用递归的方法来做这个题目,超时了;所以就尝试用记忆化搜索来写,其实也就是动态规划,,那怎样保存数据呢?这里就要用到容器 unordered_map,关于其使用方法可以去百度一下,这个东西就是一个无序的映射,就是插入元素不会自动进行排序。具体用法见代码代码/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * Tree原创 2020-09-20 20:38:48 · 94 阅读 · 0 评论 -
栈 LeetCode20有效符号
问题描述解题思路栈顶元素反映了在嵌套层次关系中,最近的需要匹配的元素这里可以利用栈代码class Solution {public: bool isValid(string s) { stack <char> a; for(int i=0;i<s.size();i++) { if(s[i]=='(' ||s[i]=='[' || s[i]=='{') a.push(s[i]); else原创 2020-09-07 18:48:29 · 91 阅读 · 0 评论 -
*递归二叉树LeetCode左叶子之和
问题描述注意事项递归条件必须注意问题是求所有左叶子之和代码/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public:原创 2020-09-07 17:24:38 · 394 阅读 · 0 评论 -
递归二叉树LeetCode112路径总和
问题描述注意事项看清楚题目的意思,,是否存在根节点到叶子结点的路径,所以递归的循环终止条件是if(rootNULL) return false;if(root->valsum&&root->leftNULL&&root->rightNULL) return true;/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeN原创 2020-09-07 16:48:39 · 71 阅读 · 0 评论 -
二叉树递归 leetcode110平衡二叉树
问题描述代码/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: int len(TreeNode *a)原创 2020-09-07 16:37:22 · 59 阅读 · 0 评论 -
递归二叉树leetcode 完全二叉树的节点个数
问题描述代码/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: int countNodes(TreeNod原创 2020-09-07 16:15:56 · 96 阅读 · 0 评论 -
递归二叉树LeetCode 101.对称二叉树
问题描述代码/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution { bool check(TreeNode *a,TreeNod原创 2020-09-07 16:09:15 · 80 阅读 · 0 评论 -
递归二叉树 LeetCode 100相同的树
问题描述/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr)原创 2020-09-07 15:40:15 · 56 阅读 · 0 评论 -
递归二叉树leetcode226翻转二叉树
问题描述看到二叉树就用递归准没错代码/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution { TreeNode *t;publ原创 2020-09-07 15:33:47 · 62 阅读 · 0 评论 -
二叉树递归LeetCode111二叉树的最小深度
问题描述代码/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: int minDepth(TreeNode*原创 2020-09-07 14:46:36 · 75 阅读 · 0 评论 -
递归与回溯 LeetCode 40组合总和2
问题描述思路与39题类似的思想 ,不过要注意去掉重复结果代码class Solution { vector <vector <int> > res; vector <int> p; int sum(vector <int> a) { int s=0; for(int i=0;i<a.size();i++) { s+=a[i]; }原创 2020-09-06 20:44:06 · 60 阅读 · 0 评论 -
递归与回溯LeetCode39 组合总和
问题描述思路看题目,明白要枚举所有可能的情况,,就可以使用递归最最重要的一点就是画出树状图,根据树状图敲代码就像依葫芦画瓢代码class Solution { vector <vector <int> > res;//存放总结果的数组 vector <int> p;//存放临时结果的数组 int sum(vector <int> a)//求和函数,求数组a中的所有元素之和 { int s=0;原创 2020-09-06 19:44:38 · 93 阅读 · 0 评论 -
递归与回溯 LeetCode 77.组合
问题描述思路老方法,,看见枚举就用递归代码class Solution {private: vector <vector <int>> res; void dfs(int n,int k,int start,vector <int> &p) { if(p.size()==k) {//套路1,先写什么时候将结果放入res res.push_back(p); }原创 2020-09-06 11:32:24 · 114 阅读 · 0 评论 -
递归与回溯 leetcode93复原Ip地址
问题描述看到枚举,直接想到递归,,看到求字符串子串就用动态规划代码class Solution {public: vector<string> restoreIpAddresses(string s) { vector<string> res;//res保存结果 restore(s, 0, "", res); return res; } void restore(string s, int k, str原创 2020-09-05 21:30:06 · 155 阅读 · 0 评论 -
递归与回溯LeetCode 46全排列
问题描述思路又是枚举问题,可以采用递归回溯的办法,关键是画出树状图代码class Solution {private: vector <bool> judge;//用来判断是否访问过 vector <vector <int> > res; //将结果储存在res中 void f(vector<int>& nums,int index,vector<int> p) { if(ind原创 2020-09-05 18:34:49 · 118 阅读 · 0 评论