Python每日一练(20230514) 不同路径 I\II\III UniquePaths

news2024/12/1 0:46:27

目录

1. 不同路径 I Unique Paths 1

2. 不同路径 II Unique Paths 2

3. 不同路径 III Unique Paths 3

🌟 每日一练刷题专栏 🌟

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏


1. 不同路径 I Unique Paths 1

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。

问总共有多少条不同的路径?

示例 1:

输入:m = 3, n = 7
输出:28

示例 2:

输入:m = 3, n = 2
输出:3
解释:
从左上角开始,总共有 3 条路径可以到达右下角。
1. 向右 -> 向下 -> 向下
2. 向下 -> 向下 -> 向右
3. 向下 -> 向右 -> 向下

示例 3:

输入:m = 7, n = 3
输出:28

示例 4:

输入:m = 3, n = 3
输出:6

提示:

  • 1 <= m, n <= 100
  • 题目数据保证答案小于等于 2 * 10^9

之前练过,代码见:Python每日一练(20230410)_Hann Yang的博客 

递归法:(不推荐,时间复杂度高)

class Solution:
    def uniquePaths(self, m: int, n: int) -> int:
        def backtrack(row, col):
            if row == 0 or col == 0:
                return 1
            return backtrack(row-1, col) + backtrack(row, col-1)
        return backtrack(m-1, n-1)

用组合公式,只要一行代码:

class Solution:
    def uniquePaths(self, m: int, n: int) -> int:
        return __import__('math').comb(m+n-2, m-1)

# %%
s = Solution()
print(s.uniquePaths(m = 3, n = 7))
print(s.uniquePaths(m = 3, n = 2))
print(s.uniquePaths(m = 7, n = 3))
print(s.uniquePaths(m = 3, n = 3))

输出:

28
3
28
6


2. 不同路径 II Unique Paths 2

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。

现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?

网格中的障碍物和空位置分别用 1 和 0 来表示。

示例 1:

输入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]
输出:2
解释:3x3 网格的正中间有一个障碍物。
从左上角到右下角一共有 2 条不同的路径:
1. 向右 -> 向右 -> 向下 -> 向下
2. 向下 -> 向下 -> 向右 -> 向右

示例 2:

输入:obstacleGrid = [[0,1],[0,0]]
输出:1

提示:

  • m == obstacleGrid.length
  • n == obstacleGrid[i].length
  • 1 <= m, n <= 100
  • obstacleGrid[i][j] 为 0 或 1

之前练过,代码见:Python每日一练(20230221)_Hann Yang的博客 

递归法:(不推荐,时间复杂度高)

class Solution:
    def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:
        m, n = len(obstacleGrid), len(obstacleGrid[0])
        def backtrack(row, col):
            if row == m or col == n or obstacleGrid[row][col] == 1:
                return 0
            if row == m - 1 and col == n - 1:
                return 1
            return backtrack(row+1, col) + backtrack(row, col+1)
        return backtrack(0, 0)
 
# %%
s = Solution()
print(s.uniquePathsWithObstacles(obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]))
print(s.uniquePathsWithObstacles(obstacleGrid = [[0,1],[0,0]]))

输出:

2
1


3. 不同路径 III Unique Paths 3

在二维网格 grid 上,有 4 种类型的方格:

  • 1 表示起始方格。且只有一个起始方格。
  • 2 表示结束方格,且只有一个结束方格。
  • 0 表示我们可以走过的空方格。
  • -1 表示我们无法跨越的障碍。

返回在四个方向(上、下、左、右)上行走时,从起始方格到结束方格的不同路径的数目

每一个无障碍方格都要通过一次,但是一条路径中不能重复通过同一个方格

示例 1:

输入:[[1,0,0,0],[0,0,0,0],[0,0,2,-1]]
输出:2
解释:我们有以下两条路径:
1. (0,0),(0,1),(0,2),(0,3),(1,3),(1,2),(1,1),(1,0),(2,0),(2,1),(2,2)
2. (0,0),(1,0),(2,0),(2,1),(1,1),(0,1),(0,2),(0,3),(1,3),(1,2),(2,2)

示例 2:

输入:[[1,0,0,0],[0,0,0,0],[0,0,0,2]]
输出:4
解释:我们有以下四条路径: 
1. (0,0),(0,1),(0,2),(0,3),(1,3),(1,2),(1,1),(1,0),(2,0),(2,1),(2,2),(2,3)
2. (0,0),(0,1),(1,1),(1,0),(2,0),(2,1),(2,2),(1,2),(0,2),(0,3),(1,3),(2,3)
3. (0,0),(1,0),(2,0),(2,1),(2,2),(1,2),(1,1),(0,1),(0,2),(0,3),(1,3),(2,3)
4. (0,0),(1,0),(2,0),(2,1),(1,1),(0,1),(0,2),(0,3),(1,3),(1,2),(2,2),(2,3)

示例 3:

输入:[[0,1],[2,0]]
输出:0
解释:
没有一条路能完全穿过每一个空的方格一次。
请注意,起始和结束方格可以位于网格中的任意位置。

提示:

  • 1 <= grid.length * grid[0].length <= 20

代码: 回溯法

from typing import List
class Solution:
    def uniquePathsIII(self, grid: List[List[int]]) -> int:
        m, n = len(grid), len(grid[0])
        start, end = None, None
        empty_count = 0

        # 找到起点、终点和空方格总数
        for i in range(m):
            for j in range(n):
                if grid[i][j] == 0:
                    empty_count += 1
                elif grid[i][j] == 1:
                    start = (i, j)
                elif grid[i][j] == 2:
                    end = (i, j)

        # 记录已访问的坐标
        visited = set()

        def backtrack(row, col, count):
            # 矩阵边界检查
            if row < 0 or row >= m or col < 0 or col >= n:
                return 0

            # 障碍检查
            if grid[row][col] == -1:
                return 0

            # 到达终点检查
            if (row, col) == end:
                if count == empty_count + 1:
                    return 1
                else:
                    return 0

            # 已经经过或已经访问
            if (row, col) in visited:
                return 0

            # 标记为已经访问
            visited.add((row, col))

            # 向四个方向前进
            paths_count = 0
            paths_count += backtrack(row+1, col, count+1)
            paths_count += backtrack(row-1, col, count+1)
            paths_count += backtrack(row, col+1, count+1)
            paths_count += backtrack(row, col-1, count+1)

            # 回溯
            visited.remove((row, col))

            return paths_count

        return backtrack(start[0], start[1], 0)

#%%
s = Solution()
grad = [[1,0,0,0],[0,0,0,0],[0,0,2,-1]]
print(s.uniquePathsIII(grad))
grad = [[1,0,0,0],[0,0,0,0],[0,0,0,2]]
print(s.uniquePathsIII(grad))
grad = [[0,1],[2,0]]
print(s.uniquePathsIII(grad))

输出:

2
4
0


🌟 每日一练刷题专栏 🌟

持续,努力奋斗做强刷题搬运工!

👍 点赞,你的认可是我坚持的动力! 

🌟 收藏,你的青睐是我努力的方向! 

评论,你的意见是我进步的财富!  

 主页:https://hannyang.blog.csdn.net/

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java每日一练(20230514) 滑动窗、最大子序和、转罗马数字

目录 1. 滑动窗口最大值 &#x1f31f;&#x1f31f; 2. 最大子序和 &#x1f31f; 3. 整数转罗马数字 &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1.…

C/C++每日一练(20230514) 全排列、分数转小数、排序链表去重II

目录 1. 全排列 &#x1f31f;&#x1f31f; 2. 分数到小数 &#x1f31f;&#x1f31f; 3. 删除排序链表中的重复元素 II &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Ja…

【C++】unordered_map与unordered_set(系列关联式容器)

文章目录 1.unordered系列关联式容器2. unordered_map3.unordered_set 1.unordered系列关联式容器 在C98中&#xff0c;STL提供了底层为红黑树结构的一系列关联式容器&#xff0c;如map和set&#xff0c;它们在查询时效率可达logN&#xff0c;即最差情况下需要比较红黑树的高度…

【UnavailableInvalidChannel: The channel is not accessible or is invalid.】

Collecting package metadata (current_repodata.json): failedUnavailableInvalidChannel: The channel is not accessible or is invalid.channel name: simplechannel url: http://pypi.douban.com/simpleerror code: 404.condarc以点开头&#xff0c;一般表示 conda 应用程…

前端016_文章管理模块_列表功能

文章管理模块_列表功能 1、需求分析2、Mock模拟接口数据3、Api调用接口4、列表模版6、分页查询7、条件查询1、需求分析 文章管理模块主要进行对文章的增删改查,一篇文章可以选择多个标签。 首先开发模块中的列表功能,包含数据列表、分页、查询。 2、Mock模拟接口数据 请求…

『MySQL 实战 45 讲』14 - count(*) 慢的根本原因

count(*) 慢的根本原因 count(*) 的实现方式 MyISAM 引擎会把一个表的总行数存在了磁盘上InnoDB 引擎需要把数据一行行读出&#xff0c;累计计数 为什么 InnoDB 不跟 MyISAM 一样&#xff0c;也把数字存起来呢 由于多版本并发控制的原因&#xff08;和快照读有关系&#xf…

APP 兼容性测试是什么?8年测试老鸟告诉你

1、APP 兼容性测试认识 随着 APP 应用范围越来越广&#xff0c;用户群体越来越大&#xff0c;终端设备的型号也越来越多&#xff0c;移动终端碎片化加剧&#xff0c;使得 APP 兼容性测试成为测试质量保障必须要考虑的环节。 APP 兼容性测试通常会考虑&#xff1a;操作系统、厂…

Golang每日一练(leetDay0065)

目录 191. 位1的个数 Nnumber of 1-bits &#x1f31f; 192. 统计词频 Word Frequency &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 191. 位1的个数 Nnum…

《编程思维与实践》1070.复数幂

《编程思维与实践》1070.复数幂 题目 思路 思路比较简单,就是细节比较繁琐: ( a b i ) ( c d i ) ( a c − b d ) ( a d b c ) i (abi)(cdi)(ac-bd)(adbc)i (abi)(cdi)(ac−bd)(adbc)i , 利用该公式分实部和虚部进行计算结果即可. 由于涉及加减和正负号,所以在大整数结构…

MySQL的事务

1、事务的概念 事务是一种机制、一个操作序列&#xff0c;包含了一组数据库操作命令&#xff0c;并且把所有的命令作为一个整体一起向系统提交或撤销操作请求&#xff0c;即这一组数据库命令要么都执行&#xff0c;要么都不执行。 事务是一个不可分割的工作逻辑单元&#xff…

【python数据分析】Pandas数据载入

&#x1f64b;‍ 哈喽大家好&#xff0c;本次是python数据分析、挖掘与可视化专栏第五期 ⭐本期内容&#xff1a;Pandas数据载入 &#x1f3c6;系列专栏&#xff1a;Python数据分析、挖掘与可视化 &#x1f44d;“总有一段时光悄悄过去然后永远怀念.” 文章目录 前言一、数据载…

fusion app 网页远程控制app

拥有此网页&#xff0c;即可。远程控制软件里面的公告更新以及其他内容。 网页并无联系方式&#xff0c;请自己摸索。 从此即可摆脱&#xff0c; QQ收藏&#xff0c;微云&#xff0c;讯飞语记的束缚&#xff01; 使用本程序网站放再多的内容都不会乱码&#xff01; FA2和1都可…

代码随想录算法训练营第四天|24. 两两交换链表中的节点 、19.删除链表的倒数第N个节点 、面试题 02.07. 链表相交 、142.环形链表II

两两交换链表中的节点 题目链接&#xff1a;力扣 解题思路&#xff1a;虚拟头节点&#xff0c;然后进行模拟即可。 我拿到这道题的时候&#xff0c;其实交换的思路是有的&#xff0c;但是首先没有设虚拟节点&#xff0c;这使得我的解答很乱&#xff0c;有很多if条件判断。其次…

Eclipse中如何使用:Maven、Git、GitHub、码云

第1章 在Eclipse 中使用 Maven 1.1 安装 Maven 核心程序 1)下载地址&#xff1a;http://maven.apache.org/ 2)检查 JAVA_HOME 环境变量。Maven 是使用 Java 开发的&#xff0c;所以必须知道当前系统环境中 JDK 的安装目录。 即&#xff1a;安装jdk目录中bin目录的上一级目录…

基于ESP32的单通道LoRaWAN网关设计资料介绍-操作模式

资料下载链接》》 介绍 这是在由ESP8266/ESP32 mcu和sx1276无线电组成的平台上实现LoRa网关功能的第6代软件。与旧版本的网关不同&#xff0c;此版本将在单一频率上收听所有可用的扩频因子 (SF)。网关使用 Web 功能&#xff08;通过 Intranet&#xff09;启用网关的监控和配置…

桂院导航小程序 云开发项目 二次开发教程

Gitee代码仓库&#xff1a;桂院导航小程序 GitHub代码仓库&#xff1a;GLU-Guide​​​​​​​ 演示视频 桂院校园导航小程序 演示视频 先 假装 大伙都成功安装了云开发项目&#xff0c;并能在 微信开发者工具 和 手机 上正确运行。 接着就是 将项目 改成自己的学校。 代码…

Redis性能测试怎么做?看看字节8年测试工程师写的测试总结

最近测试服务端的时候,接触到了redis&#xff0c;之前也看过,但不系统,借着这次实践,记录一下 01、简介 Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并提供多种语言的API。 它通常被称为数据结构…

【Linux】第一个驱动程序,hello world!开启驱动之旅

目录 前言&#xff1a; 一、背景 二、驱动程序编写流程 1.APP打开的文件在内核中如何表示&#xff1f; 2.编写驱动程序的流程 三、hello驱动程序实战 hello_drive.c hello_drive_test.c 最终测试&#xff1a; a.首先编译内核&#xff08;如果没有编译过&#xff09…

Makefile 与 docker 进行多服务 一次性构建

本机多服务一次性构建背景 本机开发多个服务,每个服务还会互相调用正常情况,开发者需要在本地启动多个服务,并且手动调用想着不使用gitlab ci/cd, 在本机快速通过 makefiledocker-compose 编排多个服务可执行源码在:https://github.com/webws/go-moda/tree/main/example/traci…

使用Segment Anything(SAM)模型进行自动标注

1.下载项目 项目1&#xff1a;https://github.com/zhouayi/SAM-Tool 项目2&#xff1a;https://github.com/facebookresearch/segment-anything git clone https://github.com/zhouayi/SAM-Tool.gitgit clone https://github.com/facebookresearch/segment-anything.git cd …