代码随想录算法训练营第36期DAY32

devtools/2024/12/22 13:07:40/

DAY32

回溯算法总结

同一树层去重的两种方法:90子集ii

class Solution {private:

    vector<vector<int>> result;

    vector<int> path;

    void backtracking(vector<int>& nums, int startIndex, vector<bool>& used) {

        result.push_back(path);

        for (int i = startIndex; i < nums.size(); i++) {

            // used[i - 1] == true,说明同一树枝candidates[i - 1]使用过

            // used[i - 1] == false,说明同一树层candidates[i - 1]使用过

            // 而我们要对同一树层使用过的元素进行跳过

            if (i > 0 && nums[i] == nums[i - 1] && used[i - 1] == false) {

                continue;

            }

            path.push_back(nums[i]);

            used[i] = true;

            backtracking(nums, i + 1, used);

            used[i] = false;

            path.pop_back();

        }

    }

public:

    vector<vector<int>> subsetsWithDup(vector<int>& nums) {

        result.clear();

        path.clear();

        vector<bool> used(nums.size(), false);

        sort(nums.begin(), nums.end()); // 去重需要排序

        backtracking(nums, 0, used);

        return result;

    }};

class Solution {private:

    vector<vector<int>> result;

    vector<int> path;

    void backtracking(vector<int>& nums, int startIndex) {

        result.push_back(path);

        unordered_set<int> uset;

        for (int i = startIndex; i < nums.size(); i++) {

            if (uset.find(nums[i]) != uset.end()) {

                continue;

            }

            uset.insert(nums[i]);

            path.push_back(nums[i]);

            backtracking(nums, i + 1);

            path.pop_back();

        }

    }

public:

    vector<vector<int>> subsetsWithDup(vector<int>& nums) {

        result.clear();

        path.clear();

        sort(nums.begin(), nums.end()); // 去重需要排序

        backtracking(nums, 0);

        return result;

    }};

使用set针对同一父节点本层去重

332重新安排行程

已经刷很多次了。

class Solution {private:// unordered_map<出发机场, map<到达机场, 航班次数>> targets

unordered_map<string, map<string, int>> targets;bool backtracking(int ticketNum, vector<string>& result) {

    if (result.size() == ticketNum + 1) {

        return true;

    }

    for (pair<const string, int>& target : targets[result[result.size() - 1]]) {

        if (target.second > 0 ) { // 记录到达机场是否飞过了

            result.push_back(target.first);

            target.second--;

            if (backtracking(ticketNum, result)) return true;

            result.pop_back();

            target.second++;

        }

    }

    return false;}public:

    vector<string> findItinerary(vector<vector<string>>& tickets) {

        targets.clear();

        vector<string> result;

        for (const vector<string>& vec : tickets) {

            targets[vec[0]][vec[1]]++; // 记录映射关系

        }

        result.push_back("JFK"); // 起始机场

        backtracking(tickets.size(), result);

        return result;

    }};

51N皇后

已经刷很多次了。

语法:二维vector:

多变量的终止条件写法:

这样写是错的:

  1.  for(int i=row-1,j=col-1;i>=0,j>=0;i--,j--)

要&&

  1. for(int i=row-1,j=col-1;i>=0&&j>=0;i--,j--)

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;

    }};

37解数独

“搜索整个树形结构用void backtracking();搜索单个树枝用bool backtracking()”

已经刷很多次了。

class Solution {private: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 k = '1'; k <= '9'; k++) {     // (i, j) 这个位置放k是否合适

                    if (isValid(i, j, k, board)) {

                        board[i][j] = k;                // 放置k

                        if (backtracking(board)) return true; // 如果找到合适一组立刻返回

                        board[i][j] = '.';              // 回溯,撤销k

                    }

                }

                return false;  // 9个数都试完了,都不行,那么就返回false

            }

        }

    }

    return true; // 遍历完没有返回false,说明找到了合适棋盘位置了}bool isValid(int row, int col, char val, vector<vector<char>>& board) {

    for (int i = 0; i < 9; i++) { // 判断行里是否重复

        if (board[row][i] == val) {

            return false;

        }

    }

    for (int j = 0; j < 9; j++) { // 判断列里是否重复

        if (board[j][col] == val) {

            return false;

        }

    }

    int startRow = (row / 3) * 3;

    int startCol = (col / 3) * 3;

    for (int i = startRow; i < startRow + 3; i++) { // 判断9方格里是否重复

        for (int j = startCol; j < startCol + 3; j++) {

            if (board[i][j] == val ) {

                return false;

            }

        }

    }

    return true;}public:

    void solveSudoku(vector<vector<char>>& board) {

        backtracking(board);

    }};


http://www.ppmy.cn/devtools/42304.html

相关文章

day08-Java常用API

day08——Java常用API 一、今日内容介绍、API概述 各位同学&#xff0c;我们前面已经学习了面向对象编程&#xff0c;使用面向编程这个套路&#xff0c;我们需要自己写类&#xff0c;然后创建对象来解决问题。但是在以后的实际开发中&#xff0c;更多的时候&#xff0c;我们是…

职业生涯第二课---“前人埋雷,后人踩坑“

前言 在这段半个月的实习生涯中&#xff0c;前几天主动优化自己写的代码&#xff0c;还学到了分布式事物锁&#xff0c;有点沾沾自喜。没想到没过几天就踩到了前人埋下的雷。 正文 事情是这样的&#xff0c;我接手了上个实习生的工作&#xff0c;对原有的程序做扩展多写几个…

【python】zip()函数介绍

一、说明 zip 是 Python 中一个非常实用的内置函数&#xff0c;用于将可迭代的对象&#xff08;如列表、元组、字典等&#xff09;作为参数&#xff0c;将对象中对应的元素打包成一个个元组&#xff0c;然后返回由这些元组组成的对象&#xff08;注意&#xff0c;返回的其实是…

ftp是什么,ftp能做什么,ftp有什么用 -----在Windows搭建ftp服务器

大家好&#xff0c;我是风屿&#xff0c;今天教大家如何从零开始搭建一台属于自己的ftp&#xff0c;本期教大家搭建Windows客户端的&#xff0c;后面是linux的 首先第一步要有一台联网的Windows电脑 1打开控制面板&#xff0c;找到程序&#xff0c;点击打开或关闭Windows功能…

【Qt】之【Bug】C2001 常量中有换行符

分析 参考&#xff1a;Qt记录&#xff1a;Qt编程遇C2001错误&#xff0c;提示“常量中有换行符”_qt 常量中有换行符-CSDN博客 原因 字符串中有中文字符 &#xff1a;使用了中文标点符号&#xff01; 解决 中文感叹号改为英文的

ECharts实现地图飞线

echarts版本&#xff1a;https://echarts.apache.org/zh/changelog.html v5.x.x版本&#xff1a;不提供china.js和china.json文件 v4.x.x版本&#xff1a;使用npm安装echarts&#xff0c;默认包含china.js和china.json文件 目录 一、Html工程 二、vue工程 三、vue工程 四、矢…

Redis教程(十四):Redis的三主三从集群搭建

Redis集群 Redis的集群是一种允许多个Redis节点在网络上互联并协作的技术,它为处理大规模数据提供了更高的性能和可扩展性,同时具有数据高可用性和故障容忍性。 以下是Redis集群的一些主要特性: 数据分片 在Redis集群中,数据会被分成多个部分,每个部分在不同的Redis节…

泰迪智能科技2024大数据分析/开发/Python数据分析项目班课程大纲

2024年大数据分析课程大纲 2024大数据开发就业班课程大纲 数据分析工程师项目班课程大纲