折磨之王
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 · 126 阅读 · 0 评论 -
动态规划leetcode 64最小路径和
与leetcode 120 三角形最短路径和类似class Solution {public: int minPathSum(vector<vector<int>>& grid) { int m=grid.size(); int n=grid[0].size(); vector <vector <int>> dp(m,vector <int> (n,0)); dp.原创 2020-09-04 15:37:26 · 157 阅读 · 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 · 188 阅读 · 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 · 116 阅读 · 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 · 141 阅读 · 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 · 134 阅读 · 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 · 242 阅读 · 0 评论 -
leetcode 90子集2 回溯算法
问题描述思路首先明确这是一个组合问题,原创 2020-10-31 10:35:19 · 108 阅读 · 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 · 102 阅读 · 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 · 90 阅读 · 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 · 89 阅读 · 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 · 128 阅读 · 0 评论