【C++刷题】优选算法——递归第二辑

  1. 全排列
vector<vector<int>> vv;
void dfs(vector<int>& nums, vector<int>& v, vector<bool>& check)
{if(v.size() == nums.size()){vv.push_back(v);return;}for(int i = 0; i < nums.size(); ++i){if(check[i] == false){v.push_back(nums[i]);check[i] = true;dfs(nums, v, check);// 回溯 -- 恢复现场v.pop_back();check[i] = false;}}
}
vector<vector<int>> permute(vector<int>& nums) 
{vector<int> v;vector<bool> check(nums.size(), false);dfs(nums, v, check);return vv;
}
  1. 子集
// 解法一
vector<vector<int>> vv;
vector<int> v;
void dfs(vector<int>& nums, int step)
{if(step == nums.size()){vv.push_back(v);return;}// 不选 nums[step]dfs(nums, step + 1);// 选 nums[step]v.push_back(nums[step]);dfs(nums, step + 1);v.pop_back();
}
vector<vector<int>> subsets(vector<int>& nums)
{dfs(nums, 0);return vv;
}// 解法二
vector<vector<int>> vv;
vector<int> v;
void dfs(vector<int>& nums, int step)
{vv.push_back(v);for(int i = step; i < nums.size(); ++i){v.push_back(nums[i]);dfs(nums, i + 1);v.pop_back();}
}
vector<vector<int>> subsets(vector<int>& nums)
{dfs(nums, 0);return vv;
}
  1. 找出所有子集的异或总和再求和
int total = 0;
int val = 0;
void dfs(vector<int>& nums, int step = 0)
{total += val;for(int i = step; i < nums.size(); ++i){val ^= nums[i];dfs(nums, i + 1);val ^= nums[i];}
}
int subsetXORSum(vector<int>& nums)
{dfs(nums, 0);return total;
}
  1. 全排列 II
vector<vector<int>> vv;
vector<int> v;
void dfs(vector<int>& nums, vector<bool>& check)
{if(v.size() == nums.size()){vv.push_back(v);return;}for(int i = 0; i < nums.size(); ++i){if(check[i] == false){if(i == 0 || check[i-1] == true || nums[i-1] != nums[i]){v.push_back(nums[i]);check[i] = true;dfs(nums, check);check[i] = false;v.pop_back();}}}
}
vector<vector<int>> permuteUnique(vector<int>& nums)
{sort(nums.begin(), nums.end());vector<bool> check(nums.size(), false);dfs(nums, check);return vv;
}
  1. 电话号码的字母组合
unordered_map<char, string> m = {{'2', "abc"},{'3', "def"},{'4', "ghi"},{'5', "jkl"},{'6', "mno"},{'7', "pqrs"},{'8', "tuv"},{'9', "wxyz"}
};
vector<string> vs;
string s;
void dfs(string& digits, int step)
{if(step == digits.size()){vs.push_back(s);return;}for(int i = 0; i < m[digits[step]].size(); ++i){s += m[digits[step]][i];dfs(digits, step + 1);s.pop_back();}
}
vector<string> letterCombinations(string digits)
{if(digits.size() == 0) return vs;dfs(digits, 0);return vs;
}
  1. 括号生成
vector<string> vs;
string s;
void dfs(int left, int right)
{if(right == 0){vs.push_back(s);return;}if(left > 0){s += "(";dfs(left - 1, right);s.pop_back();}if(right > left){s += ")";dfs(left, right - 1);s.pop_back();}
}
vector<string> generateParenthesis(int n)
{dfs(n, n);return vs;
}
  1. 组合
vector<vector<int>> vv;
vector<int> v;
void dfs(int n, int k, int step)
{if(v.size() == k){vv.push_back(v);return;}for(int i = step; i <= n; ++i){v.push_back(i);dfs(n, k, i + 1);v.pop_back();}
}
vector<vector<int>> combine(int n, int k)
{dfs(n, k, 1);return vv;
}
  1. 目标和
int ret = 0;
void dfs(vector<int>& nums, int target, int step, int sum)
{if(step == nums.size()){if(sum == target) ret += 1;return;}dfs(nums, target, step + 1, sum + nums[step]);dfs(nums, target, step + 1, sum - nums[step]);
}
int findTargetSumWays(vector<int>& nums, int target)
{dfs(nums, target, 0, 0);return ret;
}
  1. 组合总和
vector<vector<int>> vv;
vector<int> v;
void dfs(vector<int>& candidates, int target, int step, int sum)
{if(sum > target) return;if(sum == target){vv.push_back(v);return;}for(int i = step; i < candidates.size(); ++i){v.push_back(candidates[i]);dfs(candidates, target, i, sum + candidates[i]);v.pop_back();}
}
vector<vector<int>> combinationSum(vector<int>& candidates, int target)
{dfs(candidates, target, 0, 0);return vv;
}
  1. 字母大小写全排列
vector<string> vs;
string path;
void dfs(string& s, int step)
{if(step == s.size()){vs.push_back(path);return;}path += s[step];dfs(s, step + 1);path.pop_back();if(s[step] >= 'a' && s[step] <= 'z'){path += toupper(s[step]);dfs(s, step + 1);path.pop_back();}else if(s[step] >= 'A' && s[step] <= 'Z'){path += tolower(s[step]);dfs(s, step + 1);path.pop_back();}
}
vector<string> letterCasePermutation(string s)
{dfs(s, 0);return vs;
}
  1. 优美的排列
int ret = 0;
void dfs(int n, int step, vector<bool>& check)
{if(step > n) ret += 1;for(int i = 1; i <= n; ++i){if(check[i] == false){if(i % step == 0 || step % i == 0){check[i] = true;dfs(n, step + 1, check);check[i] = false;}}}
}
int countArrangement(int n)
{vector<bool> check(n + 1, false);dfs(n, 1, check);return ret;
}
  1. N 皇后
vector<vector<string>> vvs;
void dfs(vector<string>& vs, vector<vector<bool>*>& check3, int step)
{if(step == vs.size()){vvs.push_back(vs);return;}for(int j = 0; j < vs.size(); ++j){if((*check3[0])[j] == false && (*check3[1])[step - j + vs.size() - 1] == false&& (*check3[2])[step+j] == false){(*check3[0])[j] = (*check3[1])[step - j + vs.size() - 1] = (*check3[2])[step+j] = true;vs[step][j] = 'Q';dfs(vs, check3, step + 1);vs[step][j] = '.';(*check3[0])[j] = (*check3[1])[step - j + vs.size() - 1] = (*check3[2])[step+j] = false;}}
}
vector<vector<string>> solveNQueens(int n)
{vector<string> vs(n);for(int i = 0; i < n; ++i)vs[i].append(n, '.');vector<vector<bool>*> check3 = {new vector<bool>(n, false),new vector<bool>(2 * n - 1, false),new vector<bool>(2 * n - 1, false)};dfs(vs, check3, 0);delete check3[0];delete check3[1];delete check3[2];return vvs;
}
  1. 解数独
vector<vector<bool>>* row = new vector<vector<bool>>(10, vector<bool>(10, false));
vector<vector<bool>>* col = new vector<vector<bool>>(10, vector<bool>(10, false));
vector<vector<vector<bool>>>* check = new vector<vector<vector<bool>>>(3, vector<vector<bool>>(3, vector<bool>(10, false)));
bool dfs(vector<vector<char>>& board)
{for(int i = 0; i < 9; ++i){for(int j = 0; j < 9; ++j){if(board[i][j] == '.'){for(int n = 1; n <= 9; ++n){if(!(*row)[i][n] && !(*col)[j][n] && !(*check)[i/3][j/3][n]){board[i][j] = '0' + n;(*row)[i][n] = (*col)[j][n] = (*check)[i / 3][j / 3][n] = true;if(dfs(board) == true) return true;board[i][j] = '.';(*row)[i][n] = (*col)[j][n] = (*check)[i / 3][j / 3][n] = false;}}return false;}}}return true;
}
void solveSudoku(vector<vector<char>>& board)
{for (int i = 0; i < 9; ++i){for (int j = 0; j < 9; ++j){if (board[i][j] != '.'){int num = board[i][j] - '0';(*row)[i][num] = (*col)[j][num] = (*check)[i / 3][j / 3][num] = true;}}}dfs(board);delete row;delete col;delete check;
}
  1. 单词搜索
unordered_multimap<int, int> direction = {{0, 1},{0, -1},{1, 0},{-1, 0}
};
// 循环 - 方式
bool dfs(vector<vector<char>>& board, string& word, vector<vector<bool>>& visit, int i, int j, int step)
{if(step == word.size()) return true;for(auto& e : direction){int x = i + e.first, y = j + e.second;if((x >= 0 && x < board.size())&& (y >= 0 && y < board[0].size())&& (visit[x][y] == false)&& (board[x][y] == word[step])){visit[x][y] = true;if(dfs(board, word, visit, x, y, step + 1)) return true;visit[x][y] = false;}}return false;
}
// 分支 - 方式
bool dfs(vector<vector<char>>& board, string& word, vector<vector<bool>>& visit, int i, int j, int step)
{if(step == word.size()) return true;        if(i - 1 >= 0 && visit[i-1][j] == false && board[i-1][j] == word[step]){visit[i-1][j] = true;if(dfs(board, word, visit, i - 1, j, step + 1)) return true;visit[i-1][j] = false;}if(i + 1 < board.size() && visit[i+1][j] == false && board[i+1][j] == word[step]){visit[i+1][j] = true;if(dfs(board, word, visit, i + 1, j, step + 1)) return true;visit[i+1][j] = false;}if(j - 1 >= 0 && visit[i][j-1] == false && board[i][j-1] == word[step]){visit[i][j-1] = true;if(dfs(board, word, visit, i, j - 1, step + 1)) return true;visit[i][j-1] = false;}if(j + 1 < board[0].size() && visit[i][j+1] == false && board[i][j+1] == word[step]){visit[i][j+1] = true;if(dfs(board, word, visit, i, j + 1, step + 1)) return true;visit[i][j+1] = false;}return false;
}
bool exist(vector<vector<char>>& board, string word)
{vector<vector<bool>> visit = vector<vector<bool>>(board.size(), vector<bool>(board[0].size(), false));for(int i = 0; i < board.size(); ++i){for(int j = 0; j < board[0].size(); ++j){if(board[i][j] == word[0]){visit[i][j] = true;if(dfs(board, word, visit, i, j, 1)) return true;visit[i][j] = false;}}}return false;
}
  1. 黄金矿工
int ret = 0;
unordered_multimap<int, int> direction = {{0, 1},{0, -1},{1, 0},{-1, 0}
};
void dfs(vector<vector<int>>& grid, vector<vector<bool>>& visit, int i, int j, int quantity)
{if(quantity > ret) ret = quantity;for(auto& e : direction){int x = i + e.first, y = j + e.second;if((x >= 0 && x < grid.size())&& (y >= 0 && y < grid[0].size())&& (visit[x][y] == false)&& (grid[x][y] != 0)){visit[x][y] = true;dfs(grid, visit, x, y, quantity + grid[x][y]);visit[x][y] = false;}}
}
int getMaximumGold(vector<vector<int>>& grid)
{vector<vector<bool>> visit(grid.size(), vector<bool>(grid[0].size(), false));for(int i = 0; i < grid.size(); ++i){for(int j = 0; j < grid[0].size(); ++j){if(grid[i][j] != 0){visit[i][j] = true;dfs(grid, visit, i, j, grid[i][j]);visit[i][j] = false;}}}return ret;
}
  1. 不同路径 III
int ret = 0;
int count = 0;
unordered_multimap<int, int> direction = {{0, 1},{0, -1},{1, 0},{-1, 0}
};
void dfs(vector<vector<int>>& grid, vector<vector<bool>>& visit, 
int i, int j, int step)
{if(grid[i][j] == 2){if(count == step) ret += 1;return;}for(auto& e : direction){int x = i + e.first, y = j + e.second;if((x >= 0 && x < grid.size())&& (y >= 0 && y < grid[0].size())&& (visit[x][y] == false)&& (grid[x][y] != -1)){visit[x][y] = true;dfs(grid, visit, x, y, step + 1);visit[x][y] = false;}}
}
int uniquePathsIII(vector<vector<int>>& grid)
{vector<vector<bool>> visit(grid.size(), vector<bool>(grid[0].size()));int si, sj;for(int i = 0; i < grid.size(); ++i){for(int j = 0; j < grid[0].size(); ++j){if(grid[i][j] != -1) ++count;if(grid[i][j] == 1){si = i;sj = j;}}}visit[si][sj] = true;dfs(grid, visit, si, sj, 1);return ret;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/14350.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pillow学习5

ImageEnhance 模块 内置的 ImageEnhance 模块中包含了多个用于增强图像效果的函数&#xff0c;主要用来调整图像 的色彩、对比度、亮度和清晰度等&#xff0c;感觉上和调整电视机的显示参数一样。 在模块 ImageEnhance 中&#xff0c;所有的图片增强对象都实现一个通用的接口。…

nginx的配置以及常见命令

Nginx配置与常用命令指南 Nginx是一个高性能的HTTP和反向代理服务器&#xff0c;也是一个IMAP/POP3/SMTP服务器。由于它的稳定性、丰富的功能集、简单的配置文件和低资源消耗&#xff0c;Nginx在全球范围内被广泛使用。在本文中&#xff0c;我们将介绍Nginx的基本配置和一些常…

车载网络测试实操源码_使用CAPL脚本模拟发送符合协议要求(Counter和CRC)的CAN报文

系列文章目录 车载网络测试实操源码_使用CAPL脚本解析hex、S19、vbf文件 车载网络测试实操源码_使用CAPL脚本对CAN报文的Counter和CRC进行实时监控 车载网络测试实操源码_使用CAPL脚本模拟发送符合协议要求(Counter和CRC)的CAN报文 车载网络测试实操源码_使用CAPL脚本实现安全…

利用神经网络学习语言(四)——深度循环神经网络

相关说明 这篇文章的大部分内容参考自我的新书《解构大语言模型&#xff1a;从线性回归到通用人工智能》&#xff0c;欢迎有兴趣的读者多多支持。 本文涉及到的代码链接如下&#xff1a;regression2chatgpt/ch10_rnn/char_rnn_batch.ipynb 《循环神经网络&#xff08;RNN&…

【移花接木】OpenCV4.8 For Java 深度学习 实时人脸检测

学习《OpenCV应用开发&#xff1a;入门、进阶与工程化实践》一书&#xff0c;学会本文所有技能就这么简单&#xff01; 做真正的OpenCV开发者&#xff0c;从入门到入职&#xff0c;一步到位&#xff01; 前言 我写这篇文章之前&#xff0c;我搜索整个网络文章跟问各种语言大模…

速卖通测评揭秘:如何选择安全的渠道操作

许多商家对测评存在误解&#xff0c;认为只需进行几次测评就能迅速打造爆款。实际上&#xff0c;测评是一个需要计划和持久性的过程&#xff0c;以便让平台检测到产品的受众程度并提高产品的曝光和权重。 在进行测评时&#xff0c;安全是首要考虑的问题。平台可以通过设备、网…

黑马点评1——短信篇(基于session)

&#x1f308;hello&#xff0c;你好鸭&#xff0c;我是Ethan&#xff0c;一名不断学习的码农&#xff0c;很高兴你能来阅读。 ✔️目前博客主要更新Java系列、项目案例、计算机必学四件套等。 &#x1f3c3;人生之义&#xff0c;在于追求&#xff0c;不在成败&#xff0c;勤通…

如何使用多种算法解决LeetCode第135题——分发糖果问题

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容&#xff0c;和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣&#xff01; 推荐&#xff1a;数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注 导航&#xff1a; LeetCode解锁100…

WPF 的 style 定义 使用 继承 复用

style 样式 如何定义一个 style 样式 <Button Content"样式" Width"100" Height"50"><Button.Style><Style></Style></Button.Style></Button>拥有的属性 targetType “” 针对什么类型生效setter 设置属…

Ubuntu中 petalinux 安装 移植linux --tftp/tftp-hpa服务的方法

Xilinx 文档 PetaLinux 指南&#xff1a;如何创建 PetaLinux 环境 &#xff08;2019.1&#xff09; PetaLinux工具参考指南 PetaLinux安装详解(Xilinx , linux, zynq, zynqMP) petalinux 2020.1安装教程 一、PetaLinux工具和库安装 PetaLinux 工具要求主机系统 /bin/sh 为“b…

18.网络编程

网络编程 又称为Socket编程。 Java中网络编程主要是以Java语言完成信息数据在网络上的传输。 网络 计算机网络&#xff0c;指的是将不同地理位置的多台计算机连接起来&#xff0c;可以实现信息共享和信息传输。 Java是Internet上的语言&#xff0c;提供了对网络应用程序的…

笔记 | 《css权威指南》

网络安全色 URL text-indent line-height & vertical-align 字体 font-weight 400 normal 700 bold background-attachment

SpringBoot项目集成JetCache缓存框架步骤

JetCache是阿里开源的基于java开发的缓存框架&#xff0c;支持多种缓存类型&#xff1a;本地缓存、分布式缓存、多级缓存。能够满足不同业务场景的缓存需求。 1.导入依赖 <!--jetcache缓存 --> <dependency><groupId>com.alicp.jetcache</groupId>&l…

【调试笔记-20240516-Windows-使用VS2019编译edk2(上)】

调试笔记-系列文章目录 调试笔记-20240516-Windows-使用VS2019编译edk2&#xff08;上&#xff09; 文章目录 调试笔记-系列文章目录调试笔记-20240516-Windows-使用VS2019编译edk2&#xff08;上&#xff09; 前言一、安装开发工具1. 安装 VS20192. 安装 Python 3.103. 安装 …

pdf加水印怎么加?3种添加水印方法分享

pdf加水印怎么加&#xff1f;PDF加水印不仅是为了保护文档内容&#xff0c;确保信息的安全性和完整性&#xff0c;更是一种有效的版权保护措施。通过添加水印&#xff0c;您可以在文档中嵌入公司名称、日期、编号等信息&#xff0c;以明确文档的归属权和使用限制。此外&#xf…

小而美:两步完成从源码到应用的极简交付

作者&#xff1a;花三&#xff08;王俊&#xff09; Serverless 应用引擎 SAE 是阿里云推出的一款零代码改造、极简易用、自适应弹性的容器化应用托管平台&#xff0c;面市以来为几万家企业客户提供服务&#xff0c;运行稳定&#xff0c;广受好评。 SAE 的出现解决了众多企业…

Python库之lxml的简介、安装、使用方法详细攻略

Python库之lxml的简介、安装、使用方法详细攻略 简介 lxml是一个用于处理XML和HTML文档的Python库&#xff0c;它提供了简单易用的API来解析和生成这些文档。lxml以其性能和易用性而受到广泛欢迎&#xff0c;特别适合于需要处理大量数据或需要高性能解析的场景。 安装 安装…

运行时异常和编译时异常的区别

Java中的异常被分为两大类&#xff1a;编译时异常和运行时异常。 都是RuntimeException类及其子类异常&#xff0c;如NullPointerException、IndexOutOfBoundsException。这些异常是不检查异常&#xff0c;运行时异常的特点是Java编译器不会检查它&#xff0c;程序中可以选择捕…

纯代码如何实现WordPress搜索包含评论内容?

WordPress自带的搜索默认情况下是不包含评论内容的&#xff0c;不过有些WordPress网站评论内容比较多&#xff0c;而且也比较有用&#xff0c;所以想要让用户在搜索时也能够同时搜索到评论内容&#xff0c;那么应该怎么做呢&#xff1f; 网络上很多教程都是推荐安装SearchWP插…

RK3588 Android13 预安装自己的apk应用及把这个应用设置为默认桌面

1、cp -rf device/rockchip/rk3588/rk3588m_s/preinstall device/rockchip/rk3588/rk3588_t/ 2、给device/rockchip/rk3588/rk3588_t/preinstall/的存放app的文件夹改名为app-imms2&#xff0c;在app-imms2放入app-imms2.apk,编译安卓源码即可&#xff0c; 3、编译完会在out/…