瞪大眼睛搞算法 DAY7-- 面试题13. 机器人的运动范围

面试题13. 机器人的运动范围

题目来源:机器人的运动范围

地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个🤖从坐标 [0, 0] 的格子开始移动,它每次可以向👈、👉、☝️、👇 移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,🤖能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。
请问🤖能够到达多少个格子?

示例1:
输入:m = 2, n = 3, k = 1
输出:3

示例2:
输入:m = 3, n = 1, k = 0
输出:1


分析太繁琐了,👇 直接放原贴吧 😥

DFS和BFS的思路分析


方法一:深度优先搜索DFS

时间复杂度: O(MN)
空间复杂度: O(MN)

class Solution:
    def movingCount(self, m: int, n: int, k: int) -> int:
        visited = set()
        # 计算坐标的数位之和
        def calSum(n):
            sum = 0
            while(n>0):
                sum += n%10
                n = n//10
            return sum
        
        # 深度优先搜索DFS
        def dfs(i,j):
            #注意边界条件
            if i>=m or j>=n or calSum(i)+calSum(j)>k or (i,j) in visited:
                return 0
            visited.add((i,j))
            #往右方和下方移动
            res = 1+ dfs(i+1,j) + dfs(i,j+1)
            return res   #len(visited)

        return dfs(0, 0)

方法二:# 广度优先搜索BFS

时间复杂度: O(MN)
空间复杂度: O(MN)

class Solution:
    def movingCount(self, m: int, n: int, k: int) -> int:
        visited = set()
        # 计算坐标的数位之和
        def calSum(n):
            sum = 0
            while(n>0):
                sum += n%10
                n = n//10
            return sum
            
        # 广度优先搜索BFS
        queue = [(0,0)] 
        visited = set()

        while queue:  #用队列实现
            i,j = queue.pop(0)  # 删除头
            if i>=m or j>=n or calSum(i)+calSum(j)>k or (i,j) in visited:
                continue
            visited.add((i,j))
            queue.append((i+1,j))
            queue.append((i,j+1))
        return len(visited)

  小事一记:今天get了小表情的用法嘿嘿 😁

  小目标一条:希望能坚持的久一点 🙏

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值