代码随想录训练营第30天 | 332.重新安排行程、51. N皇后、37. 解数独

332.重新安排行程 

题目链接:重新安排行程

解法:

这个题,卡哥的思路会超时。辛辛苦苦看懂了卡哥的思路,结果超时了,直接崩溃。

看了leetcode官方的思路,非常简洁,但是里面的深意还是不太懂。

  1. 由于题目中说必然存在一条有效路径(至少是半欧拉图),所以算法不需要回溯(既加入到结果集里的元素不需要删除)
  2. 整个图最多存在一个死胡同(出度和入度相差1),且这个死胡同一定是最后一个访问到的,否则无法完成一笔画。
  3. DFS的调用其实是一个拆边的过程(既每次递归调用删除一条边,所有子递归都返回后,再将当前节点加入结果集保证了结果集的逆序输出),一定是递归到这个死胡同(没有子递归可以调用)后递归函数开始返回。所以死胡同是第一个加入结果集的元素。
  4. 最后逆序的输出即可。

边界条件:

时间复杂度:O(mlogm),其中 m 是边的数量。对于每一条边我们需要 O(log⁡m) 地删除它,最终的答案序列长度为 m+1,而与 n 无关。

空间复杂度:O(m),其中 m 是边的数量。我们需要存储每一条边。

class Solution:
    def findItinerary(self, tickets):
        import heapq
        from collections import defaultdict

        self.ticket_path = defaultdict(list)
        for depart, arrival in tickets:
            self.ticket_path[depart].append(arrival)
        for key in self.ticket_path:
            heapq.heapify(self.ticket_path[key])

        self.result = []
        self.traversal('JFK')
        return self.result[::-1]
        
    def traversal(self, depart):
        while self.ticket_path[depart]:
            arrival = heapq.heappop(self.ticket_path[depart])
            self.traversal(arrival)
        self.result.append(depart)

51. N皇后 

题目链接:https://leetcode.com/problems/n-queens/

解法:

可以将过程抽象为一棵树,

其他的细节,直接看题解好了:代码随想录-n皇后

边界条件:无

时间复杂度:O(n!)

空间复杂度:O(n)

class Solution(object):
    def solveNQueens(self, n):
        
        self.result = []
        self.dashboard = ['.' * n for _ in range(n)] 
        self.traversal(n, 0)
        return self.result
    
    def traversal(self, n, row):
        # 如果最后一行填满了,返回
        if row == n:
            self.result.append(self.dashboard[:])
            return
        
        for col in range(n):
            if self.isValid(row, col):
                self.dashboard[row] = self.dashboard[row][:col] + 'Q' + self.dashboard[row][col+1:]
                self.traversal(n, row+1)
                self.dashboard[row] = self.dashboard[row][:col] + '.' + self.dashboard[row][col+1:]
    
    def isValid(self, row, col):
        # 检查同一列是否已经存在皇后,
        # 如果同一个col,上面的row已经存在,则不能再放
        for i in range(row):
            if self.dashboard[i][col] == 'Q':
                return False
        
        # 检查左上角是否已经存在皇后
        i, j = row - 1, col - 1
        while i >= 0 and j >= 0:
            if self.dashboard[i][j] == 'Q':
                return False
            i -= 1
            j -= 1

        # 检查右上角是否已经存在皇后
        i, j = row - 1, col + 1
        while i >= 0 and j < len(self.dashboard):
            if self.dashboard[i][j] == 'Q':
                return False
            i -= 1
            j += 1
        return True

37. 解数独 

题目链接:解数独

解法:

这道题真的挺复杂的,代码写出来以后,看似明白了,待自己模拟运行一遍,就会发现其实理解还有待加强。算法的复杂度那是相当的高。

直接看题解吧:代码随想录-解数独

边界条件:无

时间复杂度:

空间复杂度:

class Solution(object):
    def solveSudoku(self, board):
        """
        :type board: List[List[str]]
        :rtype: None Do not return anything, modify board in-place instead.
        """
        self.traversal(board)
    
    def traversal(self, board):
        for i in range(9):
            for j in range(9):
                if board[i][j] != '.': continue
                for val in range(1, 10):
                    if self.isValid(i, j, board, str(val)):
                        board[i][j] = str(val)
                        if self.traversal(board):
                            return True
                        board[i][j] = '.'
                return False
        return True
    
    def isValid(self, row, col, board, val):
        # check the same row
        for i in range(9):
            if board[row][i] == val:
                return False
            
        # check the same column
        for j in range(9):
            if board[j][col] == val:
                return False

        # check subbox
        startRow = (row // 3) * 3
        startCol = (col // 3) * 3
        for row in range(startRow, startRow+3):
            for col in range(startCol, startCol+3):
                if board[row][col] == val:
                    return False
        return True

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

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

相关文章

excel对号怎么打

对号无论是老师批改作业&#xff0c;还是在标注某些数据的时候都会用到&#xff0c;但这个符号在键盘上是没有的&#xff0c;那么excel对号怎么打出来呢&#xff0c;其实只要使用插入符号功能就可以了。 excel对号怎么打&#xff1a; 第一步&#xff0c;选中想要打出对号的单…

OpenCV快速入门:移动物体检测和目标跟踪

文章目录 前言一、移动物体检测和目标跟踪简介1.1 移动物体检测的基本概念1.2 移动物体检测算法的类型1.3 目标跟踪的基本概念1.4 目标跟踪算法的类型 二、差值法检测移动物体2.1 差值法原理2.2 差值法公式2.3 代码实现2.3.1 视频或摄像头检测移动物体2.3.2 随机动画生成的移动…

利用kibana 快照备份es数据库

环境 主机名ip地址组件ambari-hadoop1192.168.10.101ambari-hadoop2192.168.10.102kibanaambari-hadoop3192.168.10.103es 这里我们利用共享文件系统&#xff0c;存储快照&#xff0c;所以需要利用到nfs&#xff08;NFS&#xff08;Network File System&#xff09;是一种分布…

AI超级个体:ChatGPT与AIGC实战指南

目录 前言 一、ChatGPT在日常工作中的应用场景 1. 客户服务与支持 2. 内部沟通与协作 3. 创新与问题解决 二、巧用ChatGPT提升工作效率 1. 自动化工作流程 2. 信息整合与共享 3. 提高决策效率 三、巧用ChatGPT创造价值 1. 优化产品和服务 2. 提高员工满意度和留任率…

锂电行业废水及母液除铊解决方案,除铊树脂技术

锂电池原材料和生产设备的制造、电池回收和处理等&#xff0c;产业的发展会带来铊排放问题。除了锂电池生产过 程中存在的铊污染外&#xff0c;企业的生活污水或者初期雨水也含有铊&#xff0c;因为铊是一种广泛存在于自然环境中的 元素&#xff0c;存在于饮用水、土壤和食物中…

【Linux】初识重定向(输入输出)

一切皆文件 这是Linux的设计理念&#xff0c;因为这个理念的存在我们可以使用统一的方法对待不同的东西&#xff0c;&#xff0c;这也是为什么嵌入式之类的会需要Linux&#xff0c;因为用LInux来操纵硬件真的很方便 另外我们下文也会都基于这个理念来命名&#xff0c; 比如&am…

【前端开发】Remix与Next.js

很容易&#xff0c;我们被问到的最大问题是&#xff1a; Remix与Next.js有何不同&#xff1f; 看来我们必须回答这个问题&#xff01;我们想直接而不带戏剧性地解决这个问题。如果你是Remix的粉丝&#xff0c;并且想开始在推特上对这篇文章做出沾沾自喜的反应&#xff0c;我们恳…

构建沉浸式 AI 文本编辑器:开源 3B 编辑器的设计原则与思路

借助于在 AutoDev 与 IDE 上的 AI 沉浸式体验设计&#xff0c;我们开始构建一个 AI 原生的文本编辑器&#xff0c;以探索沉浸式创作体验。其适用于需求编写、架构文档等等文档场景&#xff0c;以加速软件开发中的多种角色的日常工作。 GitHub&#xff1a;https://github.com/un…

Android问题笔记四十九:ViewPager 嵌套 Fragment 扩大滑动响应区域,避免左右滑动过于灵敏问题

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…

WPS Office JS宏实现批量处理Word中的表格样式

由于本职工作原因&#xff0c;经常会用到office办公软件&#xff0c;经常很多内容审批后&#xff0c;需要统一修改内容或样式&#xff0c;如果Word文档中有上百页或上千页&#xff0c;则一个一个修改太麻烦了。 在接触到WPSJS宏后&#xff0c;发现工作效率大大提升&#xff1b;…

ETL+BI结合的数据集成工具

在当今信息化时代&#xff0c;企业积累了大量的数据资产&#xff0c;如何高效地提取、转换和加载&#xff08;ETL&#xff09;这些数据&#xff0c;并将其转化为有用的洞察力成为了企业取得竞争优势的关键。同时&#xff0c;商业智能&#xff08;BI&#xff09;作为一种数据驱动…

ChatGPT等模型:到2026年,将消耗尽高质量训练数据

《麻省理工技术评论》曾在官网发表文章表示&#xff0c;随着ChatGPT等大模型的持续火热&#xff0c;对训练数据的需求越来越大。大模型就像是一个“网络黑洞”不断地吸收&#xff0c;最终会导致没有足够的数据进行训练。 而知名AI研究机构Epochai直接针对数据训练问题发表了一…

不受平台限制,Sketch 网页版震撼登场

Sketch 是一种基于 Mac 的矢量图形编辑器&#xff0c;可用于数字设计。其主要功能包括无损矢量编辑、完美像素精度和数百个插件同步功能&#xff0c;可导出预设和代码。它是目前流行的页面交互协作设计工具。但是 Sketch 最大的缺点是对 Windows/PC 用户不友好。严格来说&#…

CentOS添加开机启动

1.编写项目启动脚本&#xff08;run.sh&#xff09; #!/bin/bash-切换到程序所在路径 cd /home/cavs_install/app/cavs-admin/target/ # 等待其他组件启动完毕后再启动本项目&#xff08;如果不需要等待&#xff0c;本步骤可省略&#xff09; sleep 300 # 实际启动命令 nohup …

01:编译lua及C调用

我们今天在windows平台编译lua&#xff0c;生成 lua动态库,lua.exe&#xff0c;luac.exe 我把这个目录上传到giee&#xff0c;使用下面命令获取它: git clone gitgitee.com:jameschenbo/lua_c_application.git 或者直接访问:访问网页 目录结构如下&#xff1a; build.cmd 是…

Sass 安装

文章目录 前言SASS的系统要求安装Ruby例子后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;Sass和Less &#x1f431;‍&#x1f453;博主在前端领域还有很多知识和技术需要掌握&#xff0c;正在不断努力填补技术短板。(如果出现错误&…

编程题 :简单的洗牌算法的实现

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 目录 &#x1f324;️简单的洗牌算法…

大语言模型:以Amazon Titan等大语言模型为例介绍

大语言模型&#xff08;Large Language Model&#xff09;是一种人工智能技术&#xff0c;通过对海量文本数据进行训练&#xff0c;学习语言的结构、规则和语义&#xff0c;从而可以生成具有自然语言风格的文本或回答自然语言的问题。大语言模型一般基于神经网络技术&#xff0…

【深度学习】gan网络原理实现猫狗分类

【深度学习】gan网络原理实现猫狗分类 GAN的基本思想源自博弈论你的二人零和博弈&#xff0c;由一个生成器和一个判别器构成&#xff0c;通过对抗学习的方式训练&#xff0c;目的是估测数据样本的潜在分布并生成新的数据样本。 1.下载数据并对数据进行规范 transform tran…

界面控件DevExpress WPF流程图组件,完美复制Visio UI!(二)

DevExpress WPF Diagram&#xff08;流程图&#xff09;控件帮助用户完美复制Microsoft Visio UI&#xff0c;并将信息丰富且组织良好的图表、流程图和组织图轻松合并到您的下一个WPF项目中。 在上文中&#xff08;点击这里回顾>>&#xff09;&#xff0c;我们为大家介绍…