首页 > 其他分享 >day30| 332+51+37

day30| 332+51+37

时间:2023-04-14 11:12:51浏览次数:25  
标签:digit return 37 51 day30 start range False row

332. 重新安排行程

题目简述:

给你一份航线列表 tickets ,其中 tickets[i] = [fromi, toi] 表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。

所有这些机票都属于一个从 JFK(肯尼迪国际机场)出发的先生,所以该行程必须从 JFK 开始。如果存在多种有效的行程,请你按字典排序返回最小的行程组合。

例如,行程 ["JFK", "LGA"] 与 ["JFK", "LGB"] 相比就更小,排序更靠前。
假定所有机票至少存在一种合理的行程。且所有的机票 必须都用一次 且 只能用一次。

 

思路

1. 利用字典储存所有路线

2. 每选择一条路线,就删除字典中的对应路线,看最后能否遍历完所有路线

3. 如果不能,就回溯;能就返回True

4. 字典序排序的实现使用sort函数实现,在选择路线的时候,优先选择排序后,靠前的路线

 

代码如下:

class Solution:
    def findItinerary(self, tickets: List[List[str]]) -> List[str]:
        tree = {}
        total = len(tickets) # 总共有多少条航线(几张机票)
        # 生成一个字典 key是起飞机场,val是key可以到达的机场
        for airline in tickets:
            start = airline[0]
            end = airline[1]
            if start in tree:
                tree[start].append(end)
            else:
                tree[start] = [end]
        
        # 始发机场一定是JFK
        ans = ['JFK']
        # 开始 DFS
        def dfs(total,start='JFK'):
            # 如果剩余航线,即行程图没有边剩下,即可获得结果
            if total == 0:  # no ticket left
                return True
            # 如果还有行乘没有走完
            # 且当前start是一个起飞机场,即有航线是从这里起飞
            if start in tree:
                # 字典序排序  
                tree[start].sort()
                # 从起飞机场选择一个 落地机场降落
                for _ in tree[start]:
                    # 处理落地机场
                    end = tree[start].pop(0)
                    ans.append(end)
                    total -= 1
                    # 如果飞到当前落地机场,能完成所有行乘
                    if dfs(total,end):
                        return True
                    # 如果飞到当前落地机场,不能完成所有行乘
                    # 回溯当前落地机场
                    else:
                        total += 1
                        ans.pop()
                        tree[start].append(end)
            return False

        dfs(total)
        return ans

 

 

 

51. N皇后

 

 题目简述

按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。

n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。

每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。

 

思路:

1. 设计一个函数专门判断当前位置是否可行,可以放皇后

2. 设计一个函数存储解法

3. 设计一个回溯函数不断row+1往深层走,再回溯

 

代码如下:

class Solution:
    def solveNQueens(self, n: int) -> List[List[str]]:
        checkerboard=[0 for _ in range(n)]
        res=[]

        # 检查当前位置是否可行
        def check(row,column):
            # 遍历之前的行
            for row_p in range(row):
                # 检查是否在同一列
                if checkerboard[row_p]==column:
                    return False
                # 检查右上方是否有,行数+列数的值是否相等
                if checkerboard[row_p]+row_p==row+column:
                    return False
                # 检查左上方是否有,行数的差值与列数的差值是否相等
                if row-row_p==column-checkerboard[row_p]:
                    return False
            return True
        
        def draw_q(k):
            arr=[]
            for i in range(k-1):
                arr.append('.')
            arr.append('Q')
            for i in range(k,n):
                arr.append('.')
            return ''.join(i for i in arr)
        
        def dfs(checkerboard,row,path):
            if row==n:
                res.append(path[:])
                return
            
            for col in range(n):
                if check(row,col):
                    tmp=draw_q(col+1)
                    checkerboard[row]=col
                    path.append(tmp)
                    dfs(checkerboard,row+1,path)
                    path.pop()
                    checkerboard[row]=0
            return

        dfs(checkerboard,0,[])
        return res 

 

关键难点在判断当前位置是否可行上面

 

 

37. 解数独

 

题目简述:

编写一个程序,通过填充空格来解决数独问题。

数独的解法需 遵循如下规则:

数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)
数独部分空格内已填入了数字,空白格用 '.' 表示。

 

思路:

1. 用line[i],column[j],block[x][y]分别表示第i行,第j列,第(x,y)给九宫格中填写数字的情况。

2. 九宫格的范围为0<=x<=2,以及0<=y<=2

3. 也即第i行,第j列的各自位于第([i/3],[j/3])个九宫格中,其中[]表示向下取整

 

代码如下

class Solution:
    def solveSudoku(self, board: List[List[str]]) -> None:
        def dfs(pos: int):
            nonlocal valid
            if pos == len(spaces):
                valid = True
                return
            
            i, j = spaces[pos]
            for digit in range(9):
                if line[i][digit] == column[j][digit] == block[i // 3][j // 3][digit] == False:
                    line[i][digit] = column[j][digit] = block[i // 3][j // 3][digit] = True
                    board[i][j] = str(digit + 1)
                    dfs(pos + 1)
                    line[i][digit] = column[j][digit] = block[i // 3][j // 3][digit] = False
                if valid:
                    return
            
        line = [[False] * 9 for _ in range(9)]
        column = [[False] * 9 for _ in range(9)]
        block = [[[False] * 9 for _a in range(3)] for _b in range(3)]
        valid = False
        spaces = list()

        for i in range(9):
            for j in range(9):
                if board[i][j] == ".":
                    spaces.append((i, j))
                else:
                    digit = int(board[i][j]) - 1
                    line[i][digit] = column[j][digit] = block[i // 3][j // 3][digit] = True

        dfs(0)

 

标签:digit,return,37,51,day30,start,range,False,row
From: https://www.cnblogs.com/cp1999/p/17317033.html

相关文章

  • POJ 2337 Catenyms (欧拉回路+并查集)
    题目地址:POJ2337这题跟POJ1386差不多,只不过这题多一个输出路径而已。按字母来建边,每个单词的首字母和尾字母加边。先判断是否连通,然后判断每个字母的入度和出度不能出现差的绝对值大于2,然后入度和出度差的绝对值为1的不能超过两个。就可以形成欧拉路径代码如下:#include<iostream......
  • 第137篇:重学ES6模块化
    好家伙, 我原本以为学完模块化之后,就能非常顺利的完成我的项目分包,然而并没有,这是非常重要的知识,而我没有学好所以我决定重学一遍 本篇为《阮一峰ECMAScript6(ES6)标准入门教程第三版》第23章"Module的语法"学习笔记  1.概述历史上,JavaScript一直没有模块(modu......
  • day44 377. 组合总和 Ⅳ |
    给定一个由正整数组成且不存在重复数字的数组,找出和为给定目标正整数的组合的个数。示例:nums=[1,2,3]target=4所有可能的组合为:(1,1,1,1)(1,1,2)(1,2,1)(1,3)(2,1,1)(2,2)(3,1)请注意,顺序不同的序列被视作不同的组合。 classSolution{......
  • HDU 5145 NPY and girls (莫队分块离线)
    题目地址:HDU5145莫队真的好神奇。。这样的复杂度居然只有n*sqrt(n)。。。裸的莫队分块,先离线,然后按左端点分块,按块数作为第一关键字排序,然后按r值作为第二关键字进行排序。都是从小到大,可以证明这样的复杂度只有n*sqrt(n)。然后进行块之间的转移。代码如下:#include<ios......
  • SPOJ 375 QTREE系列-Query on a tree (树链剖分)
    题目地址:SPOJ375树链剖分第一发!果然是个貌似很高级的数据结构,其实就是把树的边从树形结构转化成了线性结构,从而可以用线段树或树状数组之类的数据结构进行快速维护。从而将时间缩到n*log(2*n).这题用的线段树维护的。代码如下:#include<iostream>#include<string.h......
  • POJ 3237 Tree (树链剖分)
    题目地址:POJ3237这题用了一下午。。本来一直认为max和min两个数组是不用改的,只需要改lazy数组,然后在查询的时候利用lazy标记来返回max或-min,后来发现错的很严重。。这题要在pushdown中修改max和min数组,从而实现最大值取反。代码如下:#include<iostream>#include<strin......
  • FINS5516 Corporate Finance
    MohamadMOURAD–Term1,2023UNSWSydneyFINS5516–InternationalCorporateFinanceTerm1,2023,UNSWSydneyDataExerciseAssignmentDUE:Sunday16April2023,11:59pm(Sydney,Australiatime)WeightingThisassessmentisworth15%ofyourfinalgradeforFI......
  • ASEMI代理AD9951YSVZ原装ADI车规级AD9951YSVZ
    编辑:llASEMI代理AD9951YSVZ原装ADI车规级AD9951YSVZ型号:AD9951YSVZ品牌:ADI/亚德诺封装:HTQFP-48批号:2023+引脚数量:48安装类型:表面贴装型AD9951YSVZ汽车芯片特征400MSPS内部时钟速度集成14位数模转换器(DAC)32位调整字1kHz偏移时的相位噪声≤−120dBc/Hz(DAC输出)出色......
  • RocksBD+ZenFS的安装及测试(Fedora 37)
    安装安装libzbd依赖库及libzbd://依赖yuminstallm4yuminstallautoconfyuminstalllibtoolyuminstallautomake//下载libzbd库gitclonehttps://github.com/westerndigitalcorporation/libzbd.git//编译sh./autogen.sh./configuremake//安装sudomakein......
  • Qt音视频开发37-识别鼠标按下像素坐标
    一、前言在和视频交互过程中,用户一般需要在显示视频的通道上点击对应的区域,弹出对应的操作按钮,将当前点击的区域或者绘制的多边形区域坐标或者坐标点集合,发送出去,通知其他设备进行处理。比如识别到很多人脸,用户单击某个人脸后指定对该人脸进行详细的信息查询等;再比如圈出某个区域......