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

全排列 全排列 II N皇后

46.全排列

力扣题目链接(opens new window)

给定一个 没有重复 数字的序列,返回其所有可能的全排列。

示例:

  • 输入: [1,2,3]
  • 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ]

递归终止条件:当收集元素的数组path的大小达到和nums数组一样大的时候,说明找到了一个全排列,也表示到达了叶子节点。

而used数组,其实就是记录此时path里都有哪些元素使用了,一个排列里一个元素只能使用一次。

  • 每层都是从0开始搜索而不是startIndex
  • 需要used数组记录path里都放了哪些元素了

class Solution {
public:vector<vector<int>> result;vector<int> path;void backtracking (vector<int>& nums, vector<bool>& used) {// 此时说明找到了一组if (path.size() == nums.size()) {result.push_back(path);return;}for (int i = 0; i < nums.size(); i++) {if (used[i] == true) continue; // path里已经收录的元素,直接跳过used[i] = true;path.push_back(nums[i]);backtracking(nums, used);path.pop_back();used[i] = false;}}vector<vector<int>> permute(vector<int>& nums) {result.clear();path.clear();vector<bool> used(nums.size(), false);backtracking(nums, used);return result;}
};

47.全排列 II

力扣题目链接(opens new window)

给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。

示例 1:

  • 输入:nums = [1,1,2]
  • 输出: [[1,1,2], [1,2,1], [2,1,1]]

示例 2:

  • 输入:nums = [1,2,3]
  • 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

 先排序,树层去重,123,132可以出现所以不用index,一次排列用过的元素不能再用了 所以设置used数组

class Solution {
private:vector<vector<int>> result;vector<int> path;void backtracking (vector<int>& nums, vector<bool>& used) {// 此时说明找到了一组if (path.size() == nums.size()) {result.push_back(path);return;}for (int i = 0; i < nums.size(); i++) {// used[i - 1] == true,说明同一树枝nums[i - 1]使用过// used[i - 1] == false,说明同一树层nums[i - 1]使用过// 如果同一树层nums[i - 1]使用过则直接跳过if (i > 0 && nums[i] == nums[i - 1] && used[i - 1] == false) {continue;}if (used[i] == false) {used[i] = true;path.push_back(nums[i]);backtracking(nums, used);path.pop_back();used[i] = false;}}}
public:vector<vector<int>> permuteUnique(vector<int>& nums) {result.clear();path.clear();sort(nums.begin(), nums.end()); // 排序vector<bool> used(nums.size(), false);backtracking(nums, used);return result;}
};

51. N皇后

力扣题目链接

 

  • 验证棋盘是否合法

按照如下标准去重:

  1. 不能同行
  2. 不能同列
  3. 不能同斜线 (45度和135度角)

回溯三部曲:

(1)确定参数及返回值:返回类型为void型,参数n为棋盘大小,row记录到第几层。

(2)返回条件:当遍历到棋盘的最后一层,就可以收集结果并返回。

(3)单层搜索的逻辑:每一行每一列进行遍历确定皇后的位置。

class Solution {
private:
vector<vector<string>> result;
// n 为输入的棋盘大小
// row 是当前递归到棋盘的第几行了
void backtracking(int n, int row, vector<string>& chessboard) {if (row == n) {result.push_back(chessboard);return;}for (int col = 0; col < n; col++) {if (isValid(row, col, chessboard, n)) { // 验证合法就可以放chessboard[row][col] = 'Q'; // 放置皇后backtracking(n, row + 1, chessboard);chessboard[row][col] = '.'; // 回溯,撤销皇后}}
}
bool isValid(int row, int col, vector<string>& chessboard, int n) {// 检查列for (int i = 0; i < row; i++) { // 这是一个剪枝if (chessboard[i][col] == 'Q') {return false;}}// 检查 45度角是否有皇后for (int i = row - 1, j = col - 1; i >=0 && j >= 0; i--, j--) {if (chessboard[i][j] == 'Q') {return false;}}// 检查 135度角是否有皇后for(int i = row - 1, j = col + 1; i >= 0 && j < n; i--, j++) {if (chessboard[i][j] == 'Q') {return false;}}return true;
}
public:vector<vector<string>> solveNQueens(int n) {result.clear();std::vector<std::string> chessboard(n, std::string(n, '.'));backtracking(n, 0, chessboard);return result;}
};

 

相关文章:

  • Harbor高可用(haproxy和keepalived)
  • 蓝桥杯题练习:平地起高楼
  • c++知识点之 --函数参数默认值
  • 小红书关键词爬虫
  • 光学3D表面轮廓仪微纳米三维形貌一键测量
  • 命令模式(Command Pattern)
  • 在此处打开命令窗口 (Open command window here)
  • 2023年12月CCF-GESP编程能力等级认证Scratch图形化编程三级真题解析
  • Tomcat 架构
  • ComfyUI中的翻译节点(Deep Translator Text Node)怎么用
  • openGauss学习笔记-232 openGauss性能调优-系统调优-资源负载管理-资源管理准备-资源规划
  • 掘根宝典之C语言字符串输出函数(puts(),fputs())
  • 数据迁移DTS | 云上MySQL 数据库迁移至达梦数据库
  • JavaScript-关于事件、事件流(捕获、冒泡)、事件源、常用事件
  • 总结springboot启动jar,指定配置文件
  • ➹使用webpack配置多页面应用(MPA)
  • angular2 简述
  • create-react-app做的留言板
  • ECMAScript入门(七)--Module语法
  • input实现文字超出省略号功能
  • Laravel Telescope:优雅的应用调试工具
  • Vue.js-Day01
  • 从setTimeout-setInterval看JS线程
  • 大型网站性能监测、分析与优化常见问题QA
  • 计算机常识 - 收藏集 - 掘金
  • 七牛云假注销小指南
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 数组的操作
  • 线上 python http server profile 实践
  • 小试R空间处理新库sf
  • 你对linux中grep命令知道多少?
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • 数据库巡检项
  • #NOIP 2014# day.1 T2 联合权值
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • (c语言)strcpy函数用法
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (待修改)PyG安装步骤
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (三)终结任务
  • (算法设计与分析)第一章算法概述-习题
  • (一) storm的集群安装与配置
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (转)linux 命令大全
  • (转)可以带来幸福的一本书
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值
  • .NetCore部署微服务(二)
  • /var/log/cvslog 太大
  • @ 代码随想录算法训练营第8周(C语言)|Day53(动态规划)
  • [ Linux ] git工具的基本使用(仓库的构建,提交)