【LeetCode】剑指 Offer <二刷>(6)

目录

[题目:剑指 Offer 12. 矩阵中的路径 - 力扣(LeetCode)](#题目:剑指 Offer 12. 矩阵中的路径 - 力扣(LeetCode))

题目的接口:

解题思路:

代码:

过啦!!!

[题目:剑指 Offer 13. 机器人的运动范围 - 力扣(LeetCode)](#题目:剑指 Offer 13. 机器人的运动范围 - 力扣(LeetCode))

题目的接口:

解题思路:

代码:

过啦!!!

写在最后:


题目:剑指 Offer 12. 矩阵中的路径 - 力扣(LeetCode)

题目的接口:

Go 复制代码
func exist(board [][]byte, word string) bool {

}

解题思路:

这是一道经典的搜索题,用和是深度优先搜素,这个方法是我比较喜欢使用的方法,我来讲讲这个实现方法的几个核心:

我们从上往下看,dic 数组的作用是让我们可以搜索的时候往四个方向搜素;

vis 数组的作用是用来判断在这次搜索中,格子是否被占用;

check 函数,这里就是 golang 的特色实现,我们把函数逻辑实现在主逻辑内;

最后的那个循环就是将每个格子都作为起点走搜索的逻辑。

代码:

Go 复制代码
type pair struct {
    x int
    y int
}

var dic = []pair{{-1, 0}, {1, 0}, {0, -1}, {0, 1}}

func exist(board [][]byte, word string) bool {
    h, w := len(board), len(board[0])

    // 用于判断格子是否已经被占用
    vis := make([][]bool, h)
    for i := range vis {
        vis[i] = make([]bool, w)
    }

    // 搜索函数
    var check func(i, j, k int) bool
    check = func(i, j, k int) bool {
        if board[i][j] != word[k] { // 字符匹配失败
            return false
        }
        if k == len(word)-1 { // 单词匹配成功
            return true
        }
        vis[i][j] = true // 标记使用过的单元格
        defer func() { vis[i][j] = false }() // 回溯的时候还原使用过的单元格
        for _, dir := range dic {
            newI, newJ := dir.x+i, dir.y+j
            if newI >= 0 && newI < h && newI < h && newJ >= 0 && newJ < w && !vis[newI][newJ] {
                if  check(newI, newJ, k+1) {
                    return true
                }
            }
        }
        return false
    }

    // 每个格子作为起点搜素
    for i, row := range board {
        for j := range row {
            if check(i, j, 0) {
                return true
            }
        }
    }
    return false
}

过啦!!!

题目:剑指 Offer 13. 机器人的运动范围 - 力扣(LeetCode)

题目的接口:

Go 复制代码
func movingCount(m int, n int, k int) int {

}

解题思路:

这道题还是一道搜索题,跟上一题差不多,主要有两个要点,首先是这道题我们得计算机器人走的步数,第二点是我们需要求出他的位数和才能判断他是否能够抵达该位置。

代码:

Go 复制代码
func movingCount(m int, n int, k int) int {
	dp := make([][]int, m)
	for i := range dp {
		dp[i] = make([]int, n)
	}

	return dfs(m, n, 0, 0, k, dp)
}

func dfs(m, n, i, j, k int, dp [][]int) int {
	if i < 0 || j < 0 || i >= m || j >= n || dp[i][j] == 1 || (sumPos(i)+sumPos(j)) > k {
		return 0
	}

	dp[i][j] = 1

	sum := 1
	sum += dfs(m, n, i, j+1, k, dp)
	sum += dfs(m, n, i+1, j, k, dp)
	return sum
}

// 求所有位之和
func sumPos(n int) int {
	var sum int

	for n > 0 {
		sum += n % 10
		n = n / 10
	}

	return sum
}

过啦!!!

写在最后:

以上就是本篇文章的内容了,感谢你的阅读。

如果感到有所收获的话可以给博主点一个哦。

如果文章内容有遗漏或者错误的地方欢迎私信博主或者在评论区指出~

相关推荐
你撅嘴真丑9 小时前
第九章-数字三角形
算法
uesowys9 小时前
Apache Spark算法开发指导-One-vs-Rest classifier
人工智能·算法·spark
ValhallaCoder10 小时前
hot100-二叉树I
数据结构·python·算法·二叉树
董董灿是个攻城狮10 小时前
AI 视觉连载1:像素
算法
智驱力人工智能10 小时前
小区高空抛物AI实时预警方案 筑牢社区头顶安全的实践 高空抛物检测 高空抛物监控安装教程 高空抛物误报率优化方案 高空抛物监控案例分享
人工智能·深度学习·opencv·算法·安全·yolo·边缘计算
孞㐑¥11 小时前
算法——BFS
开发语言·c++·经验分享·笔记·算法
月挽清风11 小时前
代码随想录第十五天
数据结构·算法·leetcode
XX風11 小时前
8.1 PFH&&FPFH
图像处理·算法
NEXT0611 小时前
前端算法:从 O(n²) 到 O(n),列表转树的极致优化
前端·数据结构·算法
代码游侠12 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法