代码随想录算法训练营刷题复习8 :回溯算法——子集、排列、棋盘问题

回溯算法

子集问题

①res,path; backtracking函数
②无递归终止条件判断,直接path存入res;
③递归需要startIndex;
④(补充)“有重复元素、不能包含重复的解集” 在for循环多加判断条件:i>0 && used[i-1]==false && nums[i]==nums[i-1] 跳过同层重复元素的处理

  1. 78. 子集
    递归终止条件可以省略(与for循环的判断条件一致),每次递归调用的时候先把结果写入到res中
  2. 90. 子集 II
    此题关于“有重复元素、不能包含重复的解集”的处理方法与组合问题中的一致。其他没有什么强调的了。

78. 子集
递归终止条件可以省略(与for循环的判断条件一致),每次递归调用的时候先把结果写入到res中

class Solution {
public:vector<vector<int>> res;vector<int> path;void backtracking(vector<int>& nums, int startIndex) {res.push_back(path);for(int i=startIndex;i<nums.size();i++) {path.push_back(nums[i]);backtracking(nums,i+1);path.pop_back();}}vector<vector<int>> subsets(vector<int>& nums) {backtracking(nums,0);return res;}
};

90. 子集 II
此题关于“有重复元素、不能包含重复的解集”的处理方法与组合问题中的一致。

class Solution {
public:vector<vector<int>> res;vector<int> path;void backtracking(vector<int>& nums,int startIndex, vector<bool>& used) {res.push_back(path);for(int i=startIndex;i<nums.size();i++) {if(i>0 && used[i-1]==false && nums[i]==nums[i-1]) {continue;}path.push_back(nums[i]);used[i]=true;backtracking(nums,i+1,used);path.pop_back();used[i]=false;}}vector<vector<int>> subsetsWithDup(vector<int>& nums) {sort(nums.begin(),nums.end());vector<bool> used(nums.size(),false);backtracking(nums,0,used);return res;}
};

排列问题

全排列需要对所有元素进行排列,
①终止条件:path.size == nums.size()
②for遍历元素集合为所有元素,用used控制不重复
③有重复元素,要求解集不重复的处理条件:i>0 && nums[i]==nums[i-1] && used[i-1]==false

  1. 46. 全排列
    排列问题,path写入res中一定是包含了nums的所有元素,只是排列顺序不同
    遍历的元素集合为所有元素,只是需要used数组,标记已使用过的元素避免出现重复
  2. 47. 全排列 II
    还是强调对于不重复解集的处理

46. 全排列
排列问题,path写入res中一定是包含了nums的所有元素,只是排列顺序不同
遍历的元素集合为所有元素,只是需要used数组,标记已使用过的元素避免出现重复

class Solution {
public:vector<vector<int>> res;vector<int> path;void backtracking(vector<int>& nums, vector<bool>& used) {if(path.size()==nums.size()) {res.push_back(path);}for(int i=0;i<nums.size();i++) {if(used[i]==true)continue;path.push_back(nums[i]);used[i]=true;backtracking(nums,used);path.pop_back();used[i]=false;}}vector<vector<int>> permute(vector<int>& nums) {vector<bool> used(nums.size(),false);backtracking(nums,used);return res;}
};

47. 全排列 II
还是强调对于不重复解集的处理

class Solution {
public:vector<vector<int>> res;vector<int> path;void backtracking(vector<int>& nums, vector<bool>& used) {if(path.size()==nums.size()) {res.push_back(path);}for(int i=0;i<nums.size();i++) {if(used[i]==true) {continue;}else if(i>0 && nums[i]==nums[i-1] && used[i-1]==false){continue;}path.push_back(nums[i]);used[i]=true;backtracking(nums,used);path.pop_back();used[i]=false;}}vector<vector<int>> permuteUnique(vector<int>& nums) {sort(nums.begin(),nums.end());vector<bool> used(nums.size(),false);backtracking(nums,used);return res;}
};

棋盘问题

需要定义棋盘(或题目给出),一层or两层循环(看题目逻辑),单独的isValid函数判断放置是否合理
①backtracking函数,棋盘选择按行递归或者逐元素递归
②isValid函数判断放置是否合理

  1. 51. N 皇后
    1.构建棋盘 vector chessboard(n,string(n,‘.’));
    2.逐行使用回溯,使用isValid函数判断放置位置是否合理
    3.isValid函数,判断列、45度方向、135度方向放置是否合理
  2. 37. 解数独
    1.双层循环,i j定位到要放数字的点,isValid判断是否符合逻辑,使用回溯递归调用
    2.isValid判断行、列,以及内部小九格是否有重复数字

51. N 皇后
1.构建棋盘 vector chessboard(n,string(n,‘.’));
2.逐行使用回溯,使用isValid函数判断放置位置是否合理
3.isValid函数,判断列、45度方向、135度方向放置是否合理

class Solution {
public:vector<vector<string>> res;void backtracking(int n,int row,vector<string>& chessboard) {if(row == n) {res.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;}}for(int i=row-1,j=col-1;i>=0&&j>=0;i--,j--) {if(chessboard[i][j]=='Q') {return false;}}for(int i=row-1,j=col+1;i>=0&&j<n;i--,j++) {if(chessboard[i][j]=='Q') {return false;}}return true;}vector<vector<string>> solveNQueens(int n) {vector<string> chessboard(n,string(n,'.'));backtracking(n,0,chessboard);return res;}
};

37. 解数独
1.双层循环,i j定位到要放数字的点,isValid判断是否符合逻辑,使用回溯递归调用
2.isValid判断行、列,以及内部小九格是否有重复数字

class Solution {
public:bool backtracking(vector<vector<char>>& board) {for(int i=0;i<board.size();i++) {for(int j=0;j<board[0].size();j++) {if(board[i][j]=='.') {for(char c = '1';c<='9';c++) {if(isValid(i,j,c,board)) {board[i][j]=c;if(backtracking(board)) {return true;}board[i][j]='.';}}return false;}}}return true;}bool isValid(int row,int col,char k,vector<vector<char>>& board) {for(int i=0;i<9;i++) {if(board[row][i] == k)return false;}for(int i=0;i<9;i++) {if(board[i][col] == k)return false;}int row_1 = (row/3)*3;int col_1 = (col/3)*3;for(int i=row_1;i<row_1+3;i++) {for(int j=col_1;j<col_1+3;j++) {if(board[i][j]==k)return false;}}return true;}void solveSudoku(vector<vector<char>>& board) {backtracking(board);}
};

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

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

相关文章

IDEA快速入门06-插件

六、插件 6.1 IDEA插件介绍和管理 手动演示IDEA中怎么下载插件&#xff0c;管理插件等。 File -> Settings -> Plugins 6.2 Alibaba Java Coding Guidelines 6.2.1 实时检查 6.2.2 主动检查 选中【项目名称】或者【某一个具体类】&#xff0c;右键点击【编码规约扫…

本专栏代码部分使用到的head.h

本专栏代码部分使用到的head.h 存放路径在根目录下的 /usr/include/head.h #ifndef __HEAD_H__ #define __HEAD_H__#include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <sys/types.h> #include <s…

atcoder abc 358

A welcome to AtCoder Land 题目&#xff1a; 思路&#xff1a;字符串比较 代码&#xff1a; #include <bits/stdc.h>using namespace std;int main() {string a, b;cin >> a >> b;if(a "AtCoder" && b "Land") cout <&…

汽车OTA--Flash RWW属性为什么这么重要

目录 1. OTA与RWW 1.1 FOTA需求解读 1.2 什么是RWW 2.主流OTA方案 2.1 单Bank升级 2.2 基于硬件A\B SWAP的FOTA方案 2.3 基于软件实现的FOTA方案 3.小结 1. OTA与RWW 1.1 FOTA需求解读 CP AUTOSAR R19-11首次提出了FOTA的概念&#xff0c;针对FOTA Target ECU提出了多…

状态压缩DP——AcWing 291. 蒙德里安的梦想

状态压缩DP 定义 状态压缩DP是一种利用二进制数来表示状态的动态规划算法。它通过将状态压缩成一个整数&#xff0c;从而减少状态数量&#xff0c;提高算法效率。 运用情况 状态压缩DP通常用于解决具有状态转移和最优解性质的问题&#xff0c;例如组合优化、图论、游戏等问…

AI大眼萌探索 AI 新世界:Ollama 使用指南【1】

在人工智能的浪潮中&#xff0c;Ollama 的出现无疑为 Windows 用户带来了一场革命。这款工具平台以其开创性的功能&#xff0c;简化了 AI 模型的开发与应用&#xff0c;让每一位爱好者都能轻松驾驭 AI 的强大力量。大家好&#xff0c;我是AI大眼萌&#xff0c;今天我们将带大家…

GPT-4o一夜被赶超,Claude 3.5一夜封王|快手可灵大模型推出图生视频功能|“纯血”鸿蒙大战苹果AI|智谱AI“钱途”黯淡|月之暗面被曝进军美国

快手可灵大模型推出图生视频功能“纯血”鸿蒙大战苹果AI&#xff0c;华为成败在此一举大模型低价火拼间&#xff0c;智谱AI“钱途”黯淡手握新“王者”&#xff0c;腾讯又跟渠道干上了“美食荒漠”杭州&#xff0c;走出一个餐饮IPOGPT-4o一夜被赶超&#xff0c;Anthropic推出Cl…

力扣SQL50 查询结果的质量和占比 AVG(条件)

Problem: 1211. 查询结果的质量和占比 &#x1f468;‍&#x1f3eb; 参考题解 Code select query_name,round(avg(rating/position),2) as quality,round(100 * avg(rating < 3), 2) as poor_query_percentage from Queries group by query_name -- 到此结束过不了最后一…

PHP发送HTML邮件的步骤?设置模板的技巧?

PHP发送HTML邮件怎么设置模板&#xff1f;如何用PHP群发邮件&#xff1f; PHP提供了强大的功能来发送HTML格式的电子邮件&#xff0c;这在需要发送格式化内容的邮件时特别有用。AokSend将详细介绍PHP发送HTML邮件的步骤&#xff0c;涵盖了必要的准备工作和实际操作过程。 PHP…

MySQL操作语句练习【经典20题】

emp 表视图 dept 表视图 题目 1.请从表EMP中查找工种是职员CLERK或经理MANAGER的雇员姓名、工资。 2.请在EMP表中查找部门号在10&#xff0d;30之间的雇员的姓名、部门号、工资、工作。 3.请从表EMP中查找姓名以J开头所有雇员的姓名、工资、职位。 4.请从表EMP中查找工资低…

Selenium 获取请求响应

Python 3.7 selenium3.141.0 urllib31.26.2 Chromium 109.0.5405.0 &#xff08;32 位&#xff09; import json from selenium import webdriver from selenium.common.exceptions import WebDriverException import timeoptions webdriver.ChromeOptions() # 谷歌浏览器位置…

ffmpeg音视频开发从入门到精通——ffmpeg日志及目录操作

文章目录 FFMPEG1. 操作日志2. 文件移动和删除3. 操作目录重要函数 FFMPEG 1. 操作日志 日志级别 AV LOG ERROR AV LOG WARNING AV LOG INFO AV LOG DEBUG cmake_minimum_required(VERSION 3.27) project(FFmpeg_exercise) set(CMAKE_CXX_STANDARD 14)# 定义FFmpeg的安装路…

Java之Hutool/Guava/Apache Commons工具包项目实践

概述 Hutool是一个Java工具包,提供了丰富的工具类和方法,目的是简化开发任务提高开发效率;适用于需要快速开发和实现多种功能的场景,适合项目需要处理字符串、日期、文件等常见任务时~ toBeBetterJavaer/docs/common-tool/StringUtils.md at master itwanger/toBeBetterJavae…

转--Hadoop集群部署案例

模块简介 本模块主要练习Hadoop集群部署。 模块知识 ● 使用Linux基础命令 ● Hadoop集群搭建部署知识 环境准备 三台CentOS7操作系统的虚拟机 可以是3个Docker容器&#xff0c;也可以是三个VMWare/VirtualBox的虚拟机。三台虚拟机的最低配置为1核1G 20G。如果是虚拟机中…

pytorch把图片打成patches

我以图片shape[3,308,644]&#xff0c;kernel 16*16为例。 1 首先先pad一下图片保证能被kernel完整分开。 先pad图片 C,H,Wt_img.shape pad_h (16 - H % 16) % 16 pad_w (16 - W % 16) % 16t_img F.pad(t_img, (0, pad_w, 0, pad_h))变成了[3,320,656] 那么320//1620 ,…

MK米客方德SD NAND的掉电保护机制

随着科技的飞速发展&#xff0c;数据存储设备在我们的生活和工作中扮演着越来越重要的角色。然而&#xff0c;数据安全问题也随之而来&#xff0c;尤其是面对突然的电源故障或意外断电&#xff0c;我们宝贵的数据可能会面临丢失的风险。MK米客方德公司深知这一点&#xff0c;因…

Linux中tar压缩与解压缩

TAR是Unix/Linux中常用的归档工具&#xff0c;它可以对文件或目录进行打包但不压缩&#xff0c;或者配合其他工具进行压缩。 压缩文件或目录 以下是一些基本的tar压缩命令&#xff1a; 1.压缩单个文件&#xff1a; tar -cvf archive.tar file1 2.压缩多个文件&#xff1a; t…

后仿真中的 《specify/endspecify block》之(5)使用specify进行时序仿真

前面我们学习了specify...endspecify 具体是什么东西。今天,我们使用specify block 中定义的延时,来进行一次仿真。看看到底是背后如何运转的呢。 一 基本例子 一个用 specify 指定延迟的与门逻辑描述如下: module and_gate(output Z,input A, B);assign Z = A & …

导入别人的net文件报红问题

1. 使用cmd命令 dotnet --info 查看自己使用的SDK版本 2.直接找到项目中的 global.json 文件&#xff0c;右键打开&#xff0c;直接修改版本为本机的SDK版本&#xff0c;就可以用了

CPU飙升100%怎么办?字节跳动面试官告诉你答案!

小北说在前面 CPU占用率突然飙升是技术人员常遇到的一个棘手问题&#xff0c;它是一个与具体技术无关的普遍挑战。 这个问题可以很简单&#xff0c;也可以相当复杂。 有时候&#xff0c;只是一个死循环在作祟。 有时候&#xff0c;是死锁导致的。 有时候&#xff0c;代码中有…