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

【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.lryc.cn/news/351615.html

相关文章:

  • 【GO基础】1. Go语言环境搭建
  • Py之llama-parse:llama-parse(高效解析和表示文件)的简介、安装和使用方法、案例应用之详细攻略
  • Python库之Scrapy的高级用法深度解析
  • Rust Tarui 中的 Scrcpy 客户端,旨在提供控制安卓设备的鼠标和按键映射,类似于游戏模拟器。
  • 【shell】脚本练习题
  • 微信小程序uniapp+django洗脚按摩足浴城消费系统springboot
  • 超链接的魅力:HTML中的 `<a>` 标签全方位探索!
  • 与优秀者同行,“复制经验”是成功的最快捷径
  • MobaXterm使用私钥远程登陆linux
  • Java设计模式(23种设计模式 重点介绍一些常用的)
  • JVM(5):虚拟机性能分析和故障解决工具概述
  • vue3插槽solt 使用
  • 正则项学习笔记
  • Django自定义模板标签与过滤器
  • k8s集群安装后CoreDNS 启动报错plugin/forward: no nameservers found
  • AI图片过拟合如何处理?答案就在其中!
  • 0基础如何进入IT行业
  • 一键批量提取TXT文档前N行,高效处理海量文本数据,省时省力新方案!
  • Java-常见面试题收集(十六)
  • vue从入门到精通(四):MVVM模型
  • 提供一个c# winform的多语言框架源码,采用json格式作为语言包,使用简单易于管理加载且不卡UI,支持“语言分级”管理
  • Docker常见命令
  • 中科大6系+先研院+中南大学电子信息学院2023年保研经历
  • 分布式理论--BASE
  • 【计算机网络原理】浅谈应用层协议的自定义和传输层UDP协议的总结
  • 正则表达式及其应用
  • VUE面试题(3)--vue常见面试题
  • 2024.05.24|生信早报【AI测试版】
  • 计算机毕业设计 | springboot药品库存追踪与管理系统 药店管理(附源码)
  • Flink 对接 Hudi 查询数据,java代码编写