自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(13)
  • 收藏
  • 关注

原创 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

原创 leetcode 90子集2 回溯算法

问题描述思路首先明确这是一个组合问题,

2020-10-31 10:35:19 108

原创 递归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

原创 回溯算法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 147

原创 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

原创 回溯算法 LeetCode 131 分割回文子串

问题描述思路在写题时,如果题目是要求枚举所有的情况,那么首先就要考虑递归,因为递归本身就会回溯,但根据不同的题目,在考虑时,就要注意递归的参数是否要和递归本身一样进行回溯,这也是回溯的难点和重点。如果状态容易储存,就可以考虑动态规划的方法来接,但像是本题一样的要求列举所有的到的解时,就用回溯法吧。确定好方法之后,那接下来就是画出树状图了,然后根据树状图来进行解答。代码class Solution { vector <vector <string>> res;

2020-10-24 20:34:16 194

原创 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

原创 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

原创 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 156

原创 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 91

原创 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 94

原创 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 98

原创 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 62

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除