算法打卡26

今日任务:

1)332.重新安排行程

2)51.N皇后

3)37.解数独

332.重新安排行程

题目链接:332. 重新安排行程 - 力扣(LeetCode)

给定一个机票的字符串二维数组 [from, to],子数组中的两个成员分别表示飞机出发和降落的机场地点,对该行程进行重新规划排序。所有这些机票都属于一个从 JFK(肯尼迪国际机场)出发的先生,所以该行程必须从 JFK 开始。

提示:
如果存在多种有效的行程,请你按字符自然排序返回最小的行程组合。例如,行程 ["JFK", "LGA"] 与 ["JFK", "LGB"] 相比就更小,排序更靠前
所有的机场都用三个大写字母表示(机场代码)。
假定所有机票至少存在一种合理的行程。
所有的机票必须都用一次 且 只能用一次。

示例 1:
输入:[["MUC", "LHR"], ["JFK", "MUC"], ["SFO", "SJC"], ["LHR", "SFO"]]
输出:["JFK", "MUC", "LHR", "SFO", "SJC"]

示例 2:
输入:[["JFK","SFO"],["JFK","ATL"],["SFO","ATL"],["ATL","JFK"],["ATL","SFO"]]
输出:["JFK","ATL","JFK","SFO","ATL","SFO"]
解释:另一种有效的行程是 ["JFK","SFO","ATL","JFK","ATL","SFO"]。但是它自然排序更大更靠后

文章讲解:代码随想录 (programmercarl.com)

思路:

这道题目是典型的图的遍历问题,可以使用深度优先搜索(DFS)来解决。思路如下:

  1. 首先,将机票信息存储在一个字典中,键为起始机场,值为从该机场出发的所有目的地的列表。
  2. 对每个起始机场的目的地列表进行排序,以保证在遍历时按字典序选择下一个机场。
  3. 从起始机场 JFK 开始,进行深度优先搜索,每次选择下一个目的地时,将该目的地从目的地列表中删除,表示已经使用过。
  4. 搜索过程中,如果某个机场的目的地列表为空,则说明到达了终点,返回当前路径。

class Solution:
    def findItinerary(self, tickets: List[List[str]]) -> List[str]:
        # 构建邻接表,键为起始机场,值为从该机场出发的目的地列表
        graph = defaultdict(list)  # 使用 defaultdict(list) 来创建一个默认值为列表的字典。这样,如果访问字典中不存在的键时,将返回一个空列表作为默认值。
        for start, end in tickets:
            # print(f'start:{start},end:{end}')  # start:JFK,end:SFO
            graph[start].append(end)
        # print(graph)

        # 对目的地列表进行排序,保证按字典序选择下一个机场
        for start in graph:
            graph[start].sort()
        # print(graph)

        # 存储结果的列表
        self.result = []
        self.dfs('JFK',graph)
        return self.result

    # 定义深度优先搜索函数
    def dfs(self,start,graph):
        while graph[start]:
            # 选择当前机场的下一个目的地
            next_dest = graph[start].pop(0)
            self.dfs(next_dest,graph)

        # 在结果列表的最前面插入当前机场,表示当前路径
        self.result.insert(0, start)

感想:

这题要注意的是递归到叶子节点,所以先收集的是叶子节点,然后往回收集,所以我们这里应该是在结果的最前面插入当前机场

51.N皇后

题目链接:51. N 皇后 - 力扣(LeetCode)

n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。
每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。

文章讲解:代码随想录 (programmercarl.com)

视频讲解:这就是传说中的N皇后? 回溯算法安排!| LeetCode:51.N皇后哔哩哔哩bilibili

思路:

  1. 定义一个二维数组来表示棋盘,初始化为全部为 '.',表示空位。
  2. 从第一行开始,逐行放置皇后。
  3. 在每一行中,尝试将皇后放置在该行的每一个位置,检查是否与已放置的皇后冲突。
    • 冲突条件:新放置的皇后与已放置的皇后在同一列、同一行或同一条对角线上。
  4. 如果找到一个位置可以放置皇后,则递归进入下一行,继续放置下一个皇后。
  5. 如果无法找到一个位置放置皇后,则回溯到上一行,尝试放置下一个位置的皇后。
  6. 当成功放置了 n 个皇后时,将当前棋盘状态加入结果列表中。
  7. 继续回溯,直到遍历完所有可能的情况

class Solution:
    def solveNQueens(self, n: int) -> List[List[str]]:
        self.n = n
        self.result = []
        # 初始化棋盘
        # self.board = [['.'] * n] * n   # 虽然看起来是创建了一个 n × n 大小的二维列表,但实际上每一行都是相同的列表对象的引用。这意味着如果你修改了一个行的内容,其他行也会受到影响,因为它们共享相同的子列表。
        self.board = [['.' for _ in range(n)] for _ in range(n)]
        # print(f'初始化board-->{self.board}')
        self.backtracking(0)
        return self.result

    def is_valid(self, row, col):
        # print(f'点{(row,col)}')

        # 检查列上是否有皇后
        for i in range(row):
            if self.board[i][col] == 'Q':
                return False

        # 检查左上方是否有皇后
        for i, j in zip(range(row - 1, -1, -1), range(col - 1, -1, -1)):
            # print(f'左上:{(i,j)}')
            if self.board[i][j] == 'Q':
                return False

        # 检查右上方是否有皇后
        for i, j in zip(range(row - 1, -1, -1), range(col + 1, self.n)):
            # print(f'右上:{(i,j)}')
            if self.board[i][j] == 'Q':
                return False
        return True

    def backtracking(self, row):
        # 如果当前行超过了棋盘大小,说明找到了一个解
        if row == self.n:
            self.result.append(["".join(row) for row in self.board])
            return

        # 在当前行的每个位置尝试放置皇后
        for col in range(self.n):
            if self.is_valid(row, col):
                self.board[row][col] = 'Q'
                self.backtracking(row + 1)
                self.board[row][col] = '.' # 回溯

感想:

在这里面之前犯了一个错误self.board = [['.'] * n] * n

虽然看起来是创建了一个 n × n 大小的二维列表,但实际上每一行都是相同的列表对象的引用。这意味着如果你修改了一个行的内容,其他行也会受到影响,因为它们共享相同的子列表。

为了避免这种情况,可以使用列表解析或循环来创建独立的子列表

self.board = [['.' for _ in range(n)] for _ in range(n)]

37.解数独

题目链接:37. 解数独 - 力扣(LeetCode)

编写一个程序,通过填充空格来解决数独问题。
一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。 空白格用 '.' 表示。

文章讲解:代码随想录 (programmercarl.com)

视频讲解:回溯算法二维递归?解数独不过如此!| LeetCode:37. 解数独哔哩哔哩bilibili

思路:

  1. 使用回溯法解决数独问题。
  2. 递归地尝试在每个空白格子中填入数字,然后检查是否满足数独规则。
  3. 如果满足规则,则继续向下递归填写下一个空白格子,直到填满整个数独棋盘。
  4. 如果某个格子无法填入任何数字,则回溯到上一个格子重新尝试。

class Solution:
    def solveSudoku(self, board: List[List[str]]) -> None:
        """
        Do not return anything, modify board in-place instead.
        """
        if self.backtracking(board):
            print(board)


    def backtracking(self,board):
        # 遍历整个数独棋盘
        for i in range (9):
            for j in range(9):
                # 如果当前格子不为空白,跳过
                if board[i][j] != '.':
                    continue

                # 尝试填入数字1-9
                for num in map(str, range(1, 10)):
                    # 如果填入的数字符合数独规则
                    if self.is_valid(board,i,j,num):
                        board[i][j] = num
                        # 递归调用 solve 函数,继续填下一个空白格子
                        if self.backtracking(board):
                            return True
                        # 如果填入的数字导致无解,则回溯到上一个格子,重新尝试其他数字
                        board[i][j] = '.'

                # 遍历完1-9,还没有被返回,说明当前格子无法填入任何数字,则返回 False
                return False

        # 遍历完所有格子,还没有被False提前返回,说明所有空白格子都填满了,则表示找到了解法,返回 True
        return True


    def is_valid(self,board,row,col,num):
        """
        检查填入的数字是否符合数独规则
        """
        # 检查行和列是否有重复数字
        for i in range(9):
            if board[row][i] == num or board[i][col] == num:
                return False
        # 检查3x3宫内是否有重复数字
        for i in range(3):
            for j in range(3):
                if board[(row//3)*3 + i][(col//3)*3 + j] == num:
                    return False
        return True

感想:

这题与N皇后不一样的是有三个维度,不仅要遍历行列,确定一个位置后,还要依次填入1-9的数字

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Junit单元测试框架 --java学习笔记

单元测试 就是针对最小的功能单元(方法),编写测试代码对其进行正确性测试 之前是如何进行单元测试的?有什么问题? 只能在main方法编写测试代码,去调用其他方法进行测试无法实现自动化测试,一个方法测试失败,可能影响其他方法…

Android Studio 生成 keystore 签名文件及打包验证流程

一、创建keystore签名文件 1、在菜单栏中,依次点击 Build - Generate Signed Bundle/Apk...(生成签名) 2、选择 APK 选项,点击按钮 Next 到下一步 3、新建key store秘钥文件,点击按钮 Next 到下一步 4、按如下提示填写信息,点击按…

微服务篇面试题

1、SpringCloud的组件有哪些? 2、负载均衡如何实现? 3、什么是服务雪崩?怎么解决? 4、项目中有没有做过限流? Tomcat单体可以,分布式不适合 5、解释一下CAP和BASE P:加入node03这边的网络断了&a…

逆向案例十六——简单webpack逆向,财联社信息

网址链接:财联社A股24小时电报-上市公司动态-今日股市行情报道 数据包sign参数为加密,可以直接搜索找参数的位置,搜索不到的情况下,在断点跟栈: 确定js文件所在位置,并打上断点。 点击加载刷新页面。可以发…

diffusion model(十五) : IP-Adapter技术小结

infopaperhttps://arxiv.org/pdf/2308.06721.pdfcodehttps://github.com/tencent-ailab/IP-Adapterorg.Tencent AI Lab个人博客地址http://myhz0606.com/article/ip_adapter 1 Motivation 为了对文生图diffusion model进行特定概念的定制,常用LoRA[1]、textual in…

一种驱动器的功能安全架构介绍

下图提供了驱动器实现安全功能的架构 具有如下特点: 1.通用基于总线或者非总线的架构。可以实现ethercat的FSOE,profinet的profisafe,或者伺服本体安全DIO现实安全功能。 2.基于1oo2D架构,安全等级可以达到sil3。 3.高可用性。单…

【数据库】PostgreSQL源码编译安装方式与简单配置(v16.2)

PostgreSQL源码编译安装方式与简单配置(v16.2) 一、PostgreSQL安装基本介绍1.1 几种PostgreSQL的安装方式1.2 删除原有的PostgreSQL1.3 编译安装过程简介 二、源码编译安装方式详情2.1 下载源代码2.2 编译安装运行 configure执行 make执行 make install …

制造业、能源等传统行业进行数字化转型时要注意哪些问题?

制造业、能源等传统行业在进行数字化转型时需要注意以下几个关键问题: 1、明确转型目标和战略规划:企业需要根据自身的业务特点、市场需求和长远发展目标,制定清晰的数字化转型战略。包括确定转型的重点领域、预期成果、时间表和资源投入。 …

【二叉树】【递归】Leetcode 543. 二叉树的直径

【二叉树】【递归】Leetcode 543. 二叉树的直径 解法1 ---------------🎈🎈题目链接🎈🎈------------------- 解法1 class Solution {int result 0; // 定义一个全局变量result收获每一个节点为转折点的长度public int diame…

Python基础语法及应用

一、基本数据类型及应用 1、基本数据 (1)整数(int) 在 Python 中,整数是一种基本的数据类型,用于表示没有小数部分的数字,整数没有固定的最大值,可以根据系统内存动态调整。Pytho…

LeetCode-移除元素

题目 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长…

最简单知识点PyTorch中的nn.Linear(1, 1)

一、nn.Linear(1, 1) nn.Linear(1, 1) 是 PyTorch 中的一个线性层(全连接层)的定义。 nn 是 PyTorch 的神经网络模块(torch.nn)的常用缩写。 nn.Linear(1, 1) 的含义如下: 第一个参数 1:输入特征的数量…

服务器 安装1Panel服务器运维管理面板

服务器 安装1Panel服务器运维管理面板 SSH链接服务器安装1Panel 出现此提示时输入目标路径,须以“/”开头,默认:/opt,本例:/www。 出现此提示时输入目标端口,须未被使用的端口,默认&#xff1…

媒体邀约专访如何深入地做一篇专访报道?流程分享

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 进行媒体邀约专访并深入撰写一篇专访报道是一个系统性工作,涉及多个环节。以下是一个详细的流程分享: 一、前期准备 确定专访目的与主题:明确专访希望…

一文了解低功耗蓝牙BLE

低功耗蓝牙技术可以构建两种类型的设备:双模设备和单模设备。双模设备既支持经典蓝牙又支持低功耗蓝牙。单模设备只支持低功耗蓝牙。还有仅支持经典蓝牙的设备。 在链路层,设备被分为广播者、扫描者、从设备和主设备。广播者是传输数据包的设备,扫描者是接收广播者的数据包…

华大单片机新建工程步骤

1.新建文件夹,比如00_LED 2.拷贝 hc32f460_ddl_Rev2.2.0\driver 到 00_LED 3.拷贝 hc32f460_ddl_Rev2.2.0\mcu\common 到 00_LED 4.拷贝 hc32f460_ddl_Rev2.2.0\example\ev_hc32f460_lqfp100_v2\gpio\gpio_output\source 到 00_LED 5.拷贝 hc32f460_ddl_Rev2.2.…

【C++】C++11可变参数模板

👀樊梓慕:个人主页 🎥个人专栏:《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 🌝每一个不曾起舞的日子,都是对生命的辜负 目录 前言 可变参数模板的定义…

vscode-tasks.json自定义任务

以下所有内容,参考自VScode官方文档: vscode_tasks-docs任务说明文档vscode_variables-reference-docs变量说明文档vscode addtional docs for tasksvscode launch.json 属性设置文档,(下文没有介绍,没有涉及) 浅浅记录一下个人对vscode任务(task)的理解,还谈不上使用. 文章目…

Linux 性能分析工具大全

vmstat--虚拟内存统计 vmstat(VirtualMeomoryStatistics,虚拟内存统计)是 Linux 中监控内存的常用工具,可对操作系统的虚拟内存、进程、CPU 等的整体情况进行监视。vmstat 的常规用法:vmstat interval times 即每隔 interval 秒采…

德斯兰压缩机邀您体验2024第13届国际生物发酵展

参展企业介绍 德斯兰压缩机(上海)有限公司是一家专注于研发和生产“高效节能”和“无油环保”空气压缩机的的高新技术企业。公司成立于2005年,注册资金326万美金,生产基地坐落于上海市嘉定区,建筑面积高达25,500m2。公…