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

【刷题篇】回溯算法(三)

文章目录

  • 1、全排列
  • 2、子集
  • 3、找出所有子集的异或总和再求和
  • 4、全排列 II
  • 5、电话号码的字母组合
  • 6、括号生成

1、全排列

给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
在这里插入图片描述

class Solution {
public:vector<vector<int>> ret;vector<int> path;//vector<bool> sign(7);并不能使用它,它并不能使用[],底层储存问题bool sign[7];vector<vector<int>> permute(vector<int>& nums) {dfs(nums);return ret;}void dfs(vector<int>& nums){if(nums.size()==path.size()){ret.push_back(path);return;}for(int i=0;i<nums.size();i++){if(sign[i]==false){path.push_back(nums[i]);sign[i]=true;dfs(nums);path.pop_back();sign[i]=false;}}}
};

2、子集

给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的
子集(幂集)。
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
在这里插入图片描述

class Solution {
public:vector<vector<int>> ret;vector<int> path;vector<vector<int>> subsets(vector<int>& nums) {dfs(nums,0);return ret;}//解法一// void dfs1(vector<int> nums,int i)// {//     if(i==nums.size())//     {//         ret.push_back(path);//         return;//     }//     //选//     path.push_back(nums[i]);//     dfs(nums,i+1);//     path.pop_back();//     //不选//     dfs(nums,i+1);// }//解法二void dfs(vector<int> nums,int pos){ret.push_back(path);for(int i=pos;i<nums.size();i++){path.push_back(nums[i]);dfs(nums,i+1);path.pop_back();}}
};

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

一个数组的 异或总和 定义为数组中所有元素按位 XOR 的结果;如果数组为 空 ,则异或总和为 0 。
例如,数组 [2,5,6] 的 异或总和 为 2 XOR 5 XOR 6 = 1 。
给你一个数组 nums ,请你求出 nums 中每个 子集 的 异或总和 ,计算并返回这些值相加之 和 。
注意:在本题中,元素 相同 的不同子集应 多次 计数。
数组 a 是数组 b 的一个 子集 的前提条件是:从 b 删除几个(也可能不删除)元素能够得到 a 。
在这里插入图片描述

class Solution {
public:// vector<int> ret;// vector<int> path;// int subsetXORSum(vector<int>& nums) {//     dfs(nums,0);//     int sum=0;//     for(int i=0;i<ret.size();i++)//     {//         sum+=ret[i];//     }//     return sum;// }// void dfs(vector<int> nums,int pos)// {//     int sum=0;//     for(int i=0;i<path.size();i++)//     {//         sum^=path[i];//     }//     ret.push_back(sum);//     for(int i=pos;i<nums.size();i++)//     {//         path.push_back(nums[i]);//         dfs(nums,i+1);//         path.pop_back();//     }// }int sum=0;int 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];//恢复现场}}
};

4、全排列 II

给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。
在这里插入图片描述

class Solution {
public:vector<vector<int>> ret;vector<int> path;bool check[8];vector<vector<int>> permuteUnique(vector<int>& nums) {sort(nums.begin(),nums.end());//方便后面处理分支dfs(nums,0);return ret;}void dfs(vector<int> nums,int pos){if(pos==nums.size())ret.push_back(path);for(int i=0;i<nums.size();i++){//剪枝方法一,只关心合法分支// if(check[i]==false&&(i==0||nums[i]!=nums[i-1]||(check[i-1]==true&&nums[i]==nums[i-1])))// {//     check[i]=true;//     path.push_back(nums[i]);//     dfs(nums,pos+1);//     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,pos+1);check[i]=false;path.pop_back();}}
};

5、电话号码的字母组合

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
在这里插入图片描述


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

6、括号生成

数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
在这里插入图片描述

class Solution {
public:int left,right,n;vector<string> ret;string path;vector<string> generateParenthesis(int _n) {n=_n;dfs();return ret;}void dfs(){if(right==n){ret.push_back(path);return;}if(left<n){path.push_back('(');left++;dfs();path.pop_back();left--;}if(right<left){path.push_back(')');right++;dfs();path.pop_back();right--;}}
};
http://www.lryc.cn/news/338039.html

相关文章:

  • pe格式从入门到图形化显示(八)-导入表
  • 如何将Paddle(Lite)模型转换为TensorFlow(Lite)模型
  • 最新Zibll子比主题V7.1版本源码 全新推出开心版
  • 响应式布局(其次)
  • arhtas idea plugin 使用手册
  • 数组算法——查询位置
  • 【解决leecode打不开的问题】使用chrome浏览器和其他浏览器均打不开leecode
  • 尝试在手机上运行google 最新开源的gpt模型 gemma
  • 56、巴利亚多利德大学、马德里卡洛斯三世研究所:EEG-Inception-多时间尺度与空间卷积巧妙交叉堆叠,终达SOTA!
  • ORA-00600: internal error code, arguments: [krbcbp_9]
  • uni-app实现分页--(2)分页加载,首页下拉触底加载更多
  • 前端工程化理解 (2024 面试题)
  • 10 Php学习:循环
  • FreeSWITCH 1.10.10 简单图形化界面17 - ubuntu22.04或者debian12 安装FreeSWITCH
  • ZStack Cloud 5.0.0正式发布——Vhost主存储、隔离PVLAN网络、云平台报警优化、灰度升级增强四大亮点简析
  • 商标没有去注册有哪些不好的影响!
  • 【小程序】常用方法、知识点汇总1
  • AugmentedReality之路-平面检测(5)
  • MQ:延迟队列
  • Element ui 动态展示表格列,动态格式化表格列的值
  • xxl-job调度任务原理解析
  • 实验2 路由器基本配置
  • docker部署安装整理
  • 为什么你明明拥有5年开发经验,但是依然写不出来一份简历?
  • 【ZZULIOJ】1062: 最大公约数(Java)
  • 北斗导航 | ARAIM算法的原理和性能测试
  • elasticsearch7安全配置--最低安全等级,用户名密码
  • 项目架构MVC,DDD学习
  • SQLite的PRAGMA 声明
  • 使用ArrayList.removeAll(List list)导致的机器重启