【LeetCode】ソードポインターオファー<第2ブラシ>(6)

目次

トピック: 提供する剣のポイント 12. マトリックス内のパス - LeetCode

質問インターフェイス:

問題解決のアイデア:

コード:

合格した!

トピック: ソード ポインター オファー 13. ロボットの可動範囲 - LeetCode

質問インターフェイス:

問題解決のアイデア:

コード:

合格した!

最後に次のように書きます。


トピック:提供する剣のポイント 12. マトリックス内のパス - LeetCode

質問インターフェイス:

func exist(board [][]byte, word string) bool {

}

問題解決のアイデア:

これは古典的な検索の質問です。 と を使用すると、深さ優先検索です。この方法が私が好んで使用する方法です。この実装方法のいくつかの中心的な要素についてお話しましょう:

上から下に見てみましょう dic 配列の機能は、検索時に 4 つの方向に要素を検索できるようにすることです。

vis 配列の目的は、この検索中にグリッドが占有されているかどうかを判断することです。

golang の特徴的な実装であるチェック関数は、メインロジック内に関数ロジックを実装しています。

最後のループは、各グリッドを開始点として使用して検索するロジックです。

コード:

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
}

合格した!

トピック:ソード ポインター オファー 13. ロボットの可動範囲 - LeetCode

質問インターフェイス:

func movingCount(m int, n int, k int) int {

}

問題解決のアイデア:

この質問は、前の質問と同様、まだ検索質問です。主なポイントは 2 つあります。まず、この質問では、ロボットの歩数を計算する必要があります。2 番目のポイントは、次の合計を見つける必要があることです。数値を見てその場所に到達できるかどうかを判断します。

コード:

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
}

合格した!

最後に次のように書きます。

以上がこの記事の内容です、読んでいただきありがとうございます。

何かを得たと感じたら、ブロガーに「いいね! 」を与えることができます。

記事の内容に漏れや間違いがある場合は、ブロガーにプライベートメッセージを送信するか、コメント欄で指摘してください〜

おすすめ

転載: blog.csdn.net/Locky136/article/details/132646285