算法刷题Day 30 重新安排行程+N皇后+解数独

这篇具有很好参考价值的文章主要介绍了算法刷题Day 30 重新安排行程+N皇后+解数独。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Day 30 回溯算法

332. 重新安排行程

想了很久,最后还是放弃了

这道题目有几个难点:

  1. 一个行程中,如果航班处理不好容易变成一个圈,成为死循环
  2. 有多种解法,字母序靠前排在前面,让很多同学望而退步,如何该记录映射关系呢 ?
  3. 使用回溯法(也可以说深搜) 的话,那么终止条件是什么呢?
  4. 搜索的过程中,如何遍历一个机场所对应的所有机场

这一题的解法也非常考验对数据结构的运用

class Solution {
    unordered_map<string, map<string, int>> table;

    bool backtracking(int ticketNum, vector<string> &path)
    {
        if (path.size() > ticketNum)
        {
            return true;
        }

        for (auto &[to, num] : table[path.back()])
        {
            if (num)
            {
                num--;
                path.push_back(to);
                if (backtracking(ticketNum, path))
                {
                    return true;
                }
                path.pop_back();
                num++;
            }
        }

        return false;
    }

public:
    vector<string> findItinerary(vector<vector<string>>& tickets) {
        table.clear();

        for (const auto &ticket : tickets)
        {
            table[ticket[0]][ticket[1]]++;
        }

        vector<string> path;
        path.push_back("JFK");
        backtracking(tickets.size(), path);

        return path;
    }
};

51. N皇后

class Solution {
    vector<vector<string>> rst;

    bool isValid(const vector<string> chessBoard, int row, int col)
    {
        int n = chessBoard.size();

        for (int i = row - 1; i >= 0; i--)
        {
            if (chessBoard[i][col] == 'Q')
            {
                return false;
            }
        }

        for (int i = row - 1, j = col + 1; i >= 0 && j < n; i--, j++)
        {
            if (chessBoard[i][j] == 'Q')
            {
                return false;
            }
        }

        for (int i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--)
        {
            if (chessBoard[i][j] == 'Q')
            {
                return false;
            }
        }

        return true;
    }

    void backtracking(vector<string> &chessBoard, int curRow)
    {
        int n = chessBoard.size();
        if (curRow == n)
        {
            rst.push_back(chessBoard);
            return;
        }

        for (int i = 0; i < n; ++i)
        {
            if (isValid(chessBoard, curRow, i))
            {
                chessBoard[curRow][i] = 'Q';
                backtracking(chessBoard, curRow + 1);
                chessBoard[curRow][i] = '.';
            }
        }
    }
    
public:
    vector<vector<string>> solveNQueens(int n) {
        rst.clear();
        vector<string> chessBoard(n, string(n, '.'));

        backtracking(chessBoard, 0);
        return rst;
    }
};

37. 解数独

大概有思路,但是实现起来,还是容易卡在回溯的模板里,这道题其实不是完全照搬回溯的模板就能解决的,有一点差异。文章来源地址https://www.toymoban.com/news/detail-527767.html

class Solution {
    bool isValid(const vector<vector<char>> &board, int curRow, int curCol, char c)
    {
        for (int i = 0; i < 9; ++i)
        {
            if (board[i][curCol] == c || board[curRow][i] == c)
            {
                return false;
            }
        }

        int startRow = curRow / 3 * 3;
        int startCol = curCol / 3 * 3;

        for (int i = startRow; i < startRow + 3; ++i)
        {
            for (int j = startCol; j < startCol + 3; ++j)
            {
                if (board[i][j] == c)
                {
                    return false;
                }
            }
        }

        return true;
    }

    bool backtracking(vector<vector<char>> &board)
    {
        for (int i = 0; i < 9; ++i)
        {
            for (int j = 0; j < 9; ++j)
            {
                if (board[i][j] == '.')
                {
                    for (char num = '1'; num <= '9'; num++)
                    {
                        if (isValid(board, i, j, num))
                        {
                            board[i][j] = num;
                            if (backtracking(board))
                            {
                                return true;
                            }
                            board[i][j] = '.';
                        }
                    }
                    return false;
                }
            }
        }
        return true;
    }

public:
    void solveSudoku(vector<vector<char>>& board) {
        backtracking(board);
    }
};

到了这里,关于算法刷题Day 30 重新安排行程+N皇后+解数独的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【算法刷题】Day28

    原题链接 第 i 个元素是一支给定的股票在第 i 天的价格 最多可以完成 两笔 交易 注意:你不能同时参与多笔交易 1. 状态表示: dp[i] 表示:第 i 天结束之后,所能获得的最大利润 f[i][j] 表示:第 i 天结束之后,完成了 j 次交易,此时处于“买入”状态下的,最大利润 g[i][j]

    2024年02月02日
    浏览(41)
  • 算法练习Day30 (Leetcode/Python-动态规划)

    62. Unique Paths There is a robot on an  m x n  grid. The robot is initially located at the  top-left corner  (i.e.,  grid[0][0] ). The robot tries to move to the  bottom-right corner  (i.e.,  grid[m - 1][n - 1] ). The robot can only move either down or right at any point in time. Given the two integers  m  and  n , return  the number of possible

    2024年01月20日
    浏览(41)
  • 算法刷题Day 24 回溯算法理论基础+组合

    回溯法,一般可以解决如下几种问题: 组合问题:N个数里面按一定规则找出k个数的集合 切割问题:一个字符串按一定规则有几种切割方式 子集问题:一个N个数的集合里有多少符合条件的子集 排列问题:N个数按一定规则全排列,有几种排列方式 棋盘问题:N皇后,解数独等

    2024年02月15日
    浏览(40)
  • 算法刷题day34:并查集

    今天写的题集是并查集,其实感觉有两个难点,一个是,要维护多余的信息和路径压缩,另一个难点则是抽象出来合并集合的这个操作,还是要不断地练习,看别人怎么去做,加油! 标签:并查集 思路: 模板题,没啥说的 题目描述: 示例代码: 标签:并查集 思路: 其实

    2024年03月21日
    浏览(63)
  • 【算法日志】贪心算法刷题:重叠区问题(day31)

    目录 前言 无重叠区间(筛选区间) 划分字母区间(切割区间)  合并区间 今日的重点是掌握重叠区问题。

    2024年02月12日
    浏览(47)
  • 力扣算法刷题Day59|单调栈

    力扣题目:# 503.下一个更大元素II  刷题时长:参考题解后2min 解题方法:单调栈 复杂度分析 时间O(n) 空间O(n) 问题总结 如何解决环的问题 本题收获 循环数组解决方案 思路一:将两个nums数组拼接在一起,使用单调栈计算出每一个元素的下一个最大值,最后再把结果集即res

    2024年02月13日
    浏览(73)
  • 算法刷题Day 60 柱状图中的最大矩阵

    暴力解法 超时了 分别找出当前位置左边 第一个 比自己小的索引(的后一个位置)和右边 第一个 比自己小的索引(的前一个位置),这个范围之内,就是以当前位置的高度所能达到的最大宽度。 单调栈 有了接雨水那道题的经验,这一道题可以模仿着做出了

    2024年02月14日
    浏览(54)
  • 算法刷题Day 39 不同路径+不同路径II

    递归(深搜) 使用递归的方法超时(可以过37个case) 来分析一下时间复杂度,这个深搜的算法,其实就是要遍历整个二叉树。 这棵树的深度其实就是m+n-1(深度按从1开始计算)。 那二叉树的节点个数就是 2^(m + n - 1) - 1。可以理解深搜的算法就是遍历了整个满二叉树(其实没

    2024年02月12日
    浏览(45)
  • 算法刷题Day1 二分查找+移除元素

    代码随想录-数组-1.数组理论基础 数组是存放在 连续内存空间 上的 相同类型 数据的 集合 优点:常数时间复杂度访问元素 缺点: 在删除或者增添元素的时候,就难免要移动其他元素的地址 ,时间复杂度为O(n) 代码随想录-数组-2.二分查找 前提条件 二分查找前提条件: 数组

    2024年02月10日
    浏览(52)
  • 算法刷题营【Day1】:: 704.二分查找:二分法详谈与相关刷题

    本内容是笔者结合《代码随想录》总结所得,记录学习过程,分享知识! 目录: 1. 开篇例题:704. 二分查找 2. 题解参考(模板写法) - - 2.1 方法一:左闭右闭写法 - - 2.2 方法二:左闭右开写法 3. 模板解释:左闭右闭 - - 3.1 区间划定 - - 3.2 left 、right 移动问题 - - 3.3 循环条件

    2024年02月04日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包