当前位置: 首页 > wzjs >正文

dz论坛网站源码适合公司建设的网站

dz论坛网站源码,适合公司建设的网站,wordpress代码 lt,商城类网站总体功能策划文章目录 一、排列问题全排列II题解代码 优美的排列题解代码 二、子集问题字母大小写全排列题解代码 找出所有子集的异或总和再求和题解代码 三、组合问题电话号码的字母组合题解代码 括号生成题解代码 组合题解代码 目标和题解代码 组合总和题解代码 总结 一、排列问题 全排列…

文章目录

  • 一、排列问题
  • 全排列II
    • 题解
    • 代码
  • 优美的排列
    • 题解
    • 代码
  • 二、子集问题
  • 字母大小写全排列
    • 题解
    • 代码
  • 找出所有子集的异或总和再求和
    • 题解
    • 代码
  • 三、组合问题
  • 电话号码的字母组合
    • 题解
    • 代码
  • 括号生成
    • 题解
    • 代码
  • 组合
    • 题解
    • 代码
  • 目标和
    • 题解
    • 代码
  • 组合总和
    • 题解
    • 代码
  • 总结

一、排列问题

全排列II

题目链接
在这里插入图片描述

题解

1. 这题和全排列那题框架是一样的,就是剪枝操作不一样
2. 同一节点出现相同元素肯定会重复,所以把同一节点的相同元素剪掉
3. 同一个数只能出现一次,用check数组剪枝
分为两种情况进行剪枝:
1、只关心不合法的分支:
不合法的进行跳过(剪枝)
check[i] == true || ( i != 0 &&nums[i] == nums[i-1] && check[i-1] == false)
这个点是已经使用过的,或者是这个点和前一个点是相同的并且前一个点没有使用过,i != 0保证不越界
2、只关心合法的分支:
合法的分支才进行dfs
check[i] == false && (i == 0 || nums[i] != nums[i-1] || check[i] == true)
这个点没有被使用过并且该点为第一个点肯定可以进行dfs,或者是该点和前一个点不相同也可以dfs,或者是该点和前一个点相同,但是前一个点上一层已经使用过了,这个点这层可以继续使用,因为它们是用的不同位置

在这里插入图片描述

代码

class Solution 
{
public:vector<vector<int>> ret;vector<int> path;bool check[9];vector<vector<int>> permuteUnique(vector<int>& nums) {sort(nums.begin(),nums.end());dfs(nums);return ret;}void dfs(vector<int> nums){if(path.size() == nums.size()){ret.push_back(path);return;}// 如何把重复的数字剪掉for(int i = 0;i < nums.size();i++){// 合法的剪枝,不合法就不进行dfs// if((check[i] == false)&&// (i == 0||nums[i] != nums[i-1]||check[i-1] == true))// {//     check[i] = true;//     path.push_back(nums[i]);//     dfs(nums);//     // 恢复现场//     check[i] = false;//     path.pop_back();// }// 考虑不合法的剪枝,跳过不合法的剪枝if((check[i] == true)||(i != 0&&nums[i] == nums[i-1]&&check[i-1] == false))continue;check[i] = true;path.push_back(nums[i]);dfs(nums);// 恢复现场check[i] = false;path.pop_back();}}
};

优美的排列

题目链接
在这里插入图片描述

题解

1. 画出决策树
2. 全局变量的设计:ret用来记录优美排列的个数,check数组检查是否可以剪枝,n设计成全局变量就不需要进行传参了
3. 剪枝:第一种剪枝不能出现重复的数,第二种剪枝不满足整除条件的
4. 回溯:如图我们每个位置都要进行判断,每个位置都会走一遍,递归完后进行恢复现场,把最后一位pop_back
5. 递归出口:当path路径的长度等于n时为递归出口
6. for循环的i = 1开始是因为要遍历所有的路径,dfs中pos+1是因为此位置遍历完会来到下一个位置进行遍历,画出决策树就很清晰了

在这里插入图片描述

代码

class Solution
{
public:int n;int ret;bool check[16];vector<int> path;int countArrangement(int _n) {n = _n;dfs(1);return ret;}void dfs(int pos){if(path.size() == n){ret++;return;}for(int i = 1;i <= n;i++){if(pos % i == 0 || i % pos == 0){if(check[i] == false){check[i] = true;path.push_back(i);dfs(pos+1);// 恢复现场path.pop_back();check[i] = false;}} }}
};

二、子集问题

字母大小写全排列

题目链接
在这里插入图片描述

题解

1. 画出决策树
2. 全局变量:ret记录最终的结果,path记录每次的路径
3. 剪枝:没有剪枝
4. 回溯:到达叶子节点的时候记录完进行回溯,pop_back最后一个位置的数来到上一层
5. 递归出口:pos位置为n时,是最后一个数据的下一个位置,为递归出口
6. 这题和选和不选基本上是一样的,子集问题,pos这个位置变或者不变然后来到下一个位置,所以dfs(pos+1),变的情况为小写字母时转为大写字母,大写转为小写,不变就直接push

在这里插入图片描述

代码

class Solution 
{
public:vector<string> ret;string path;vector<string> letterCasePermutation(string s) {dfs(s,0);return ret;}void dfs(string s,int pos){// 为什么不能写pos == s.size()if(pos == s.size()){ret.push_back(path);return;}char ch = s[pos];// 不变path.push_back(ch);dfs(s,pos+1);path.pop_back();// 变if(ch < '0' || ch > '9'){ch = change(ch);path.push_back(ch);dfs(s,pos+1);path.pop_back();}}char change(char ch){if(ch >= 'a' && ch <= 'z') ch -= 32;else ch += 32;return ch;}
};

找出所有子集的异或总和再求和

题目链接
在这里插入图片描述

题解

1. 画出决策树
2. 全局变量:用sum记录最终的结果,用path记录一个集合的异或和
3. 剪枝:没有剪枝
4. 回溯:每次异或当前元素就抵消掉这个元素了,然后回到上一层
5. 递归出口:没有递归出口,每次把path加到sum中即可
6. for循环中每次从pos位置开始向后枚举,避免重复,dfs(i+1),i+1就是数组中下一个位置的数,相当于剪枝了

在这里插入图片描述

代码

class Solution 
{
public:long long sum = 0;// 记录全部路径的异或和long long path = 0;// 记录一条路径的异或和int subsetXORSum(vector<int>& nums) {dfs(nums,0);return sum;}void dfs(vector<int> nums,int pos){sum += path;for(int i = pos;i < nums.size();i++){path ^= nums[i];dfs(nums,i+1);path ^= nums[i];// 不能使用pos代替i,如果进行回溯回来,// 进行循环,path始终异或nums[pos]}}
};

三、组合问题

电话号码的字母组合

题目链接
在这里插入图片描述

题解

1. 画出决策树
2. 全局变量:ret记录最终的结果,path记录每次的路径,哈希表记录下标的映射关系
3. 剪枝:没有剪枝
4. 回溯:到达叶子节点时,pop_back最后一个元素,恢复现场
5. 递归出口:path的长度和给定的数组的长度相同
6. for循环把所有的数都枚举出来了,所以i下标从0开始,dfs(pos+1),每个位置枚举完跳到下一个位置继续枚举,这题主要是建立一个hash表记录每次的电话号码的数字对应的映射字符串

在这里插入图片描述

代码

class Solution 
{
public:vector<string> ret;string path;string hash[10] = {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};vector<string> letterCombinations(string digits) {if(digits.size() == 0) return ret;dfs(digits,0);   return ret;}void dfs(string digits,int pos){if(pos == digits.size()){ret.push_back(path);return;}for(int i = 0;i < hash[digits[pos] - '0'].size();i++){path.push_back(hash[digits[pos] - '0'][i]);dfs(digits,pos+1);// 恢复现场path.pop_back();}}
};

括号生成

题目链接
在这里插入图片描述

题解

1. 画出决策树
2. 全局变量:path记录每次的路径,ret记录最终的结果,left记录左括号的数量,right记录右括号的数量
3. 剪枝:第一种右括号的数量大于等于左括号的数量,第二中左括号的数量大于等于n的数量,开始的时候只能给左扩号,右括号剪枝,左右括号相等时,不能加入右括号,左括号大于n不符合结果,等于n时,再往下加就大于n,需要剪枝
4. 回溯:如果是左括号回溯,pop_back最后一个元素,left–,如果是右括号回溯,pop_back最后一个元素,right–
5. 递归出口:右括号的数量等于n时,为左右括号相等的最终结果

在这里插入图片描述

代码

class Solution 
{
public:vector<string> ret;string path;int left,right;vector<string> generateParenthesis(int n) {dfs(n);return ret;}void dfs(int n){if(right == n){ret.push_back(path);return ;}if(left < n){path.push_back('(');left++;dfs(n);path.pop_back();left--;}if(left > right){path.push_back(')');right++;dfs(n);path.pop_back();right--;}}
};

组合

题目链接
在这里插入图片描述

题解

1. 画出决策树
2. 全局变量:path记录每次的路径,ret记录最终的结果,k变为全局变量,不需要多传一个参数
3. 剪枝:不能重复出现相同的数剪枝,长度不够k也剪枝,这题可以从pos位置开始向后枚举,dfs(i+1),i+1表示每次枚举当前数的下一个位置的数,相当于进行了剪枝
4. 回溯:到达叶子节点后,每次pop_back最后一个数
5. 递归出口:path的长度等于k的大小

在这里插入图片描述

代码

class Solution 
{
public:vector<vector<int>> ret;vector<int> path;int k;vector<vector<int>> combine(int n, int _k) {k = _k;dfs(n,1);return ret;}void dfs(int n,int pos){if(path.size() == k){ret.push_back(path);return ;}for(int i = pos;i <= n;i++){path.push_back(i);dfs(n,i+1);path.pop_back();// 恢复现场}}
};

目标和

题目链接
在这里插入图片描述

题解

1. 画出决策树
2. 全局变量:ret记录最终的结果,target变为全局变量就少传一个参数
3. 剪枝:没有剪枝
4. 回溯:函数自动回溯,将path作为参数,记录每条路径的大小,回到上一层,path变为了没有加减之前的path
5. 递归出口:最终的path等于target的大小,ret++
6. 这题就是每个数两种情况,要么加,要么减

在这里插入图片描述

代码

class Solution 
{
public:int ret,target;int findTargetSumWays(vector<int>& nums, int _target) {target = _target;dfs(nums,0,0);return ret;}void dfs(vector<int>& nums,int pos,int path){if(pos == nums.size()){if(target == path)ret++;return;}// 加法,放在参数中函数帮我们自动恢复现场了dfs(nums,pos+1,path + nums[pos]);// 减法dfs(nums,pos+1, path - nums[pos]);}
};

组合总和

题目链接
在这里插入图片描述

题解

解法一:每个pos位置填
1. 画出决策树
2. 全局变量:ret记录最终的结果,path记录每条路径,target变为全局变量就不需要传参target了
3. 剪枝:如果这条路径的和大于target剪枝,如果选择的路径重复了剪枝,这种可以使用i = pos位置开始向后枚举,dfs(i),i表示每次从当前这个数向后枚举,不需要重复枚举这个数前面的数,就避免了重复的路径,达到了剪枝的效果
4. 回溯:sum在函数的参数中自动进行了回溯,pop_back最后一个元素,回到上一层
5. 递归出口:目标值等于记录的路径总和就找到一条路径,加入ret中,并返回给上一层

在这里插入图片描述

代码

class Solution 
{
public:vector<vector<int>> ret;vector<int> path;int target;vector<vector<int>> combinationSum(vector<int>& candidates, int _target) {target = _target;dfs(candidates,0,0);return ret;}void dfs(vector<int> candidates,int pos,int sum){if(sum == target){ret.push_back(path);return;}// 枚举完了所有的位置也不是target,这个总和比较小if(pos == candidates.size()) return;for(int i = pos;i < candidates.size();i++){if(sum > target) continue;path.push_back(candidates[i]);dfs(candidates,i,sum + candidates[i]);path.pop_back();}}
};

解法二:枚举每个数的数量
1. 和解法一不一样的地方就是dfs函数的实现不一样

在这里插入图片描述

class Solution 
{
public:vector<vector<int>> ret;vector<int> path;int target;vector<vector<int>> combinationSum(vector<int>& candidates, int _target) {target = _target;dfs(candidates,0,0);return ret;}void dfs(vector<int> candidates,int pos,int sum){if(sum == target){ret.push_back(path);return;}// 枚举完了所有的位置也不是target,这个总和比较小if(pos == candidates.size() || sum > target) return;// 枚举个数for(int k = 0;sum + k * candidates[pos] <= target;k++){if(k) path.push_back(candidates[pos]);dfs(candidates,pos+1,sum + k*candidates[pos]);}// 整块恢复现场for(int k = 1;sum + k * candidates[pos] <= target;k++){path.pop_back();}}
};

总结

1. 最重要的就是画出决策树
2. 全局变量:一般是path记录路径,ret记录各个路径的结果
3. 剪枝:看题目分析和看决策树
4. 回溯:一般是pop_back最后一个元素
5. 递归出口:看题目条件,或者是叶子节点

在这里插入图片描述


文章转载自:

http://QtG4LCAH.rnyhx.cn
http://drs0GXEr.rnyhx.cn
http://S36tU2xw.rnyhx.cn
http://QaHekSQ2.rnyhx.cn
http://3MpKG8Zk.rnyhx.cn
http://GFZ5gV3A.rnyhx.cn
http://YtlAgdBS.rnyhx.cn
http://5ATs40Bi.rnyhx.cn
http://6CjV7cUn.rnyhx.cn
http://R88ADPzh.rnyhx.cn
http://6DrdubId.rnyhx.cn
http://LPu4fjcr.rnyhx.cn
http://sWDqgAi0.rnyhx.cn
http://PlopOdBX.rnyhx.cn
http://6lEk7GiK.rnyhx.cn
http://a6pJzDzO.rnyhx.cn
http://yHb97AsI.rnyhx.cn
http://4GS1hhX3.rnyhx.cn
http://3bLInHMa.rnyhx.cn
http://hjmnhJFQ.rnyhx.cn
http://DIa7z92w.rnyhx.cn
http://B4ubZwSt.rnyhx.cn
http://YER5F1fi.rnyhx.cn
http://s7G0qqmQ.rnyhx.cn
http://N2mWu4LJ.rnyhx.cn
http://EqX68xFs.rnyhx.cn
http://64cnbd6x.rnyhx.cn
http://dSz4Y50Z.rnyhx.cn
http://OymIKk0l.rnyhx.cn
http://w038vChB.rnyhx.cn
http://www.dtcms.com/wzjs/614134.html

相关文章:

  • 合肥网站制作哪家强摄影网站设计代码
  • 盗版小说网站建设河北seo网站优化报价
  • 番禺网站建设哪里有企业网站用什么做
  • 青年人爱看的网站抖音运营
  • 设计网站收费怎样自己制作广告图片
  • 电商购物网站模板下载广州网站建设吧
  • 怎么优化自己的网站优秀地方门户网站系统
  • 360打不开建设银行的网站查网站域名备案查询
  • 百度建站系统合肥企业网站建
  • 站长统计网站统计神木网站建设
  • 网站开发遇到的风险毕业设计可以做网站不
  • 校园网建设网站特色推广普通话的意义50字
  • 营销型网站开发流程包括淘宝客免费网站建设
  • 返回链接 网站惩罚检查 错误检查山如何搭建响应式网站
  • 科凡全屋定制濮阳网站优化公司哪家好
  • 手机企业网站源码wordpress文本框代码
  • 如何做属于自己的网站网页制作专业选择
  • 网站推广广告 优帮云企业网站建设公司 末路
  • 淄博网站设计策划方案维护wordpress on.7主题
  • 网站不备案违法吗申请域网站
  • 站长统计企业网络推广方案
  • 网站的产品上传图片wordpress 静态主页
  • 做一个网站建设的流程电商平台推广方式
  • 搭建网站是什么意思教育直播平台网站建设费用
  • 吉林市建设工程档案馆网站搜索引擎都有哪些
  • 怎么制作自己的网站wordpress安装在本地
  • 网站开发要学习路线柳州网站建设源码
  • 网站宣传推广策划方案wordpress应用教程
  • 郑州网站建设 李浩深圳外贸公司网站
  • 北京做网站电话wordpress时间调用