当前位置: 首页 > 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;
}

相关文章:

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

全排列 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_ba…...

【GO基础】1. Go语言环境搭建

Go语言环境搭建 Go的三种安装方式Go标准包安装Windows 安装验证是否安装成功 4.Go的第一个程序 Hello World.go Go的三种安装方式 Go有多种安装方式&#xff0c;可以选择自己适合的。这里介绍三种最常见的安装方式&#xff1a; Go源码安装&#xff1a;这是一种标准的软件安装…...

Py之llama-parse:llama-parse(高效解析和表示文件)的简介、安装和使用方法、案例应用之详细攻略

Py之llama-parse&#xff1a;llama-parse(高效解析和表示文件)的简介、安装和使用方法、案例应用之详细攻略 目录 llama-parse的简介 llama-parse的安装和使用方法 1、安装 2、使用方法 第一步&#xff0c;获取API 密钥 第二步&#xff0c;安装LlamaIndex、LlamaParse L…...

Python库之Scrapy的高级用法深度解析

Python库之Scrapy的高级用法深度解析 引言 Scrapy是一个强大的Web爬虫框架&#xff0c;它提供了丰富的功能和灵活的扩展性&#xff0c;使得在Python中编写爬虫变得简单而高效。本文将深入探讨Scrapy的高级用法&#xff0c;帮助读者充分利用Scrapy的强大功能。 目录 引言Scr…...

Rust Tarui 中的 Scrcpy 客户端,旨在提供控制安卓设备的鼠标和按键映射,类似于游戏模拟器。

Scrcpy-mask 为了实现电脑控制安卓设备&#xff0c;本人使用 Tarui Vue 3 Rust 开发了一款跨平台桌面客户端。该客户端能够提供可视化的鼠标和键盘按键映射配置。通过按键映射实现了实现类似安卓模拟器的多点触控操作&#xff0c;具有毫秒级响应速度。该工具可广泛用于电脑控…...

【shell】脚本练习题

案例&#xff1a; 1. for ping测试指网段的主机 网段由用户输入&#xff0c;例如用户输入192.168.2 &#xff0c;则ping 192.168.2.10 --- 192.168.2.20 UP&#xff1a; /tmp/host_up.txt Down: /tmp/host_down.txt 2. 使用case实现成绩优良差的判断 1. for ping测试指…...

微信小程序uniapp+django洗脚按摩足浴城消费系统springboot

原生wxml开发对Node、预编译器、webpack支持不好&#xff0c;影响开发效率和工程构建。所以都会用uniapp框架开发 前后端分离&#xff0c;后端给接口和API文档&#xff0c;注重前端,接近原生系统 使用Navicat或者其它工具&#xff0c;在mysql中创建对应名称的数据库&#xff0…...

超链接的魅力:HTML中的 `<a>` 标签全方位探索!

&#x1f310;超链接的魅力&#xff1a;HTML中的 标签全方位探索&#xff01; &#x1f3de;️基础营地&#xff1a;认识 <a> 标签&#x1f6e0;️基本语法&#x1f4da;属性扩展 &#x1f680;实战演练&#xff1a;超链接的多样玩法&#x1f308;内链与外链&#x1f4c…...

与优秀者同行,“复制经验”是成功的最快捷径

富在术数不在劳身&#xff0c;利在局势不在力耕。我们始终相信&#xff0c;与优秀者同行&#xff0c;“复制经验”才是走向成功的最快“捷径”! 酷雷曼合作商交流会 作为酷雷曼合作商帮扶体系里的重要一环&#xff0c;合作商交流会是总部专门为合作商们搭建的一个博采众长、相…...

MobaXterm使用私钥远程登陆linux

秘钥的形式使用MobaXterm 远程连接 linux 服务器 MobaXterm使用私钥远程登陆linux just填写远程主机 不指定用户 勾选使用私钥 选择私钥即可 1.使用秘钥连接 远程linux 服务器的好处 只需要第一次添加秘钥&#xff0c;并输入密码后&#xff0c;以后再连接就不需要再输入密码…...

Java设计模式(23种设计模式 重点介绍一些常用的)

创建型模式&#xff0c;共五种&#xff1a;工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。结构型模式&#xff0c;共七种&#xff1a;适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。行为型模式&#xff0c;共十一种&#xff1a;…...

JVM(5):虚拟机性能分析和故障解决工具概述

1 工具概述 作为一个java程序员&#xff0c;最基本的要求就是用java语言编写程序&#xff0c;并能够在jvm虚拟机上正常运行&#xff0c;但是在实际开发过程中&#xff0c;我们所有的程序由于各种各样的原因&#xff0c;并不是总能够正常运行&#xff0c;经常会发生故障或者程序…...

vue3插槽solt 使用

背景增加组件的复用性&#xff0c;个人体验组件化还是react 方便。 Vue插槽solt如何传递具名插槽的数据给子组件&#xff1f; 一、solt 原理 知其然知其所以然 Vue的插槽&#xff08;slots&#xff09;是一种分发内容的机制&#xff0c;允许你在组件模板中定义可插入的内容…...

正则项学习笔记

目录 1. L2 正则化 岭回归 1.1 L2 norm计算例子 2. L1 正则化 3. 弹性网正则化 4. Dropout 1. L2 正则化 岭回归 在 PyTorch 中&#xff0c;L2 正则化通常通过设置优化器的 weight_decay 参数实现。以下是一个简单的例子&#xff1a; 介绍博文&#xff1a; 正则化(1)&a…...

Django自定义模板标签与过滤器

title: Django自定义模板标签与过滤器 date: 2024/5/17 18:00:02 updated: 2024/5/17 18:00:02 categories: 后端开发 tags: Django模版自定义标签过滤器开发模板语法Python后端前端集成Web组件 Django模板系统基础 1. Django模板语言概述 Django模板语言&#xff08;DTL&…...

k8s集群安装后CoreDNS 启动报错plugin/forward: no nameservers found

安装k8s过程中遇到的问题&#xff1a; 基本信息 系统版本&#xff1a;ubuntu 22.04 故障现象&#xff1a; coredns 报错&#xff1a;plugin/forward: no nameservers found 故障排查&#xff1a; #检查coredns的配置&#xff0c;发现有一条转发到/etc/resolv.conf的配置…...

AI图片过拟合如何处理?答案就在其中!

遇到难题不要怕&#xff01;厚德提问大佬答&#xff01; 厚德提问大佬答8 你是否对AI绘画感兴趣却无从下手&#xff1f;是否有很多疑问却苦于没有大佬解答带你飞&#xff1f;从此刻开始这些问题都将迎刃而解&#xff01;你感兴趣的话题&#xff0c;厚德云替你问&#xff0c;你解…...

0基础如何进入IT行业

目录 引言 一、了解IT行业 1.1 IT行业概述 1.2 IT行业的职业前景 二、选择适合的学习路径 2.1 自学 2.2 参加培训班 2.3 高等教育 三、学习基础技能 3.1 编程语言 3.2 数据结构与算法 3.3 计算机基础知识 四、实践与项目经验 4.1 开源项目 4.2 个人项目 4.3 实习…...

一键批量提取TXT文档前N行,高效处理海量文本数据,省时省力新方案!

大量的文本信息充斥着我们的工作与生活。无论是研究资料、项目文档还是市场报告&#xff0c;TXT文本文档都是我们获取和整理信息的重要来源。然而&#xff0c;面对成百上千个TXT文档&#xff0c;如何快速提取所需的关键信息&#xff0c;提高工作效率&#xff0c;成为了许多人头…...

Java-常见面试题收集(十六)

二十五 RocketMQ 1 消息队列介绍 消息队列&#xff0c;简称 MQ&#xff08;Message Queue&#xff09;&#xff0c;它其实就指消息中间件&#xff0c;当前业界比较流行的开源消息中间件包括&#xff1a;RabbitMQ、RocketMQ、Kafka。&#xff08;一个使用队列来通信的组件&…...

AI 大模型未来技术演进方向与应用发展趋势预判

引言&#xff1a;AI 技术快速迭代&#xff0c;未来已来AI 大模型技术正以超乎想象的速度迭代演进&#xff0c;从参数规模扩张到能力提升、从技术架构创新到应用场景拓展、从成本高企到普惠落地&#xff0c;每一次技术突破都在重塑产业格局、改变商业逻辑、影响生活方式。2026 年…...

手把手教你把Windows虚拟内存文件pagefile.sys从C盘挪走,给SSD系统盘腾出几十G空间

彻底解放C盘空间&#xff1a;Windows虚拟内存文件迁移全指南 你是否遇到过这样的场景&#xff1a;刚装完系统时C盘还剩下大半空间&#xff0c;用着用着却突然弹出"磁盘空间不足"的警告&#xff1f;打开资源管理器一看&#xff0c;一个名为pagefile.sys的"巨无霸…...

嵌入式核心板选型与开发实战:M28x-T与M6G2C硬件设计及AWorks平台应用

1. 项目概述&#xff1a;为什么我们需要“一体化”核心板&#xff1f;在嵌入式产品开发&#xff0c;尤其是工业控制、数据采集这类对稳定性和开发效率要求极高的领域&#xff0c;很多工程师都经历过一个痛苦的过程&#xff1a;选型一颗主控MCU&#xff0c;然后围绕它去设计DDR内…...

Axure RP 9汉化后,这些高效原型设计技巧让你事半功倍

Axure RP 9汉化后高效原型设计实战指南 当你终于完成Axure RP 9的安装与汉化&#xff0c;面对熟悉的中文界面&#xff0c;是否感到一丝茫然&#xff1f;从"能用"到"善用"这个强大的原型设计工具&#xff0c;中间隔着一道效率的鸿沟。本文将带你跨越这道鸿沟…...

tinychain实战教程:10步掌握区块链交易验证与挖矿机制

tinychain实战教程&#xff1a;10步掌握区块链交易验证与挖矿机制 【免费下载链接】tinychain A pocket-sized implementation of Bitcoin 项目地址: https://gitcode.com/gh_mirrors/ti/tinychain tinychain是一个轻量级的比特币实现&#xff0c;让你能够快速理解区块链…...

掌握Manim数学动画引擎:从零到一的完整攻略

掌握Manim数学动画引擎&#xff1a;从零到一的完整攻略 【免费下载链接】manim Animation engine for explanatory math videos 项目地址: https://gitcode.com/GitHub_Trending/ma/manim Manim是一款专为数学可视化设计的强大动画引擎&#xff0c;能够通过编程方式创建…...

量子纠错码与逻辑门优化实现技术解析

1. 量子纠错码与逻辑门实现基础量子纠错码是量子计算中确保计算可靠性的核心技术。与经典计算不同&#xff0c;量子态具有相干性和不可克隆性&#xff0c;这使得量子信息在存储和处理过程中极易受到环境噪声的影响。稳定子码&#xff08;Stabilizer Codes&#xff09;作为一类重…...

机器学习生产化实战:从Notebook到高可用模型服务

1. 项目概述&#xff1a;这不是一次“部署上线”&#xff0c;而是一场从实验室到产线的系统性迁移“From Notebook to Production: Running ML in the Real World (Part 4)”——这个标题本身就像一句暗号&#xff0c;老手一眼就懂&#xff1a;它不是在讲怎么调参、不是教你怎么…...

SQL Server报错注入原理与实战:从错误机制到WAF绕过

1. 报错注入不是“碰运气”&#xff0c;而是对SQL Server错误机制的精准利用很多人一听到“报错注入”&#xff0c;第一反应是“得看目标网站开不开错误提示”“得撞运气看有没有报错回显”。这种理解停留在表层&#xff0c;甚至会误导初学者放弃深入——其实恰恰相反&#xff…...

Keil MDK构建时间戳记录方案与实现

1. 项目概述&#xff1a;Keil MDK构建时间戳记录方案在嵌入式开发中&#xff0c;项目构建&#xff08;Project Build&#xff09;的时间管理是个容易被忽视却至关重要的细节。当我们需要调试复杂工程时&#xff0c;准确记录构建开始时间可以帮助我们同步调试日志&#xff1b;而…...