6260.矩阵查询可获得的最大分数

60 阅读1分钟

题目:
给你一个大小为 m x n 的整数矩阵 grid 和一个大小为 k 的数组 queries 。

找出一个大小为 k 的数组 answer ,且满足对于每个整数 queres[i] ,你从矩阵 左上角 单元格开始,重复以下过程:

  • 如果 queries[i] 严格 大于你当前所处位置单元格,如果该单元格是第一次访问,则获得 1 分,并且你可以移动到所有 4 个方向(上、下、左、右)上任一 相邻 单元格。
  • 否则,你不能获得任何分,并且结束这一过程。

在过程结束后,answer[i] 是你可以获得的最大分数。注意,对于每个查询,你可以访问同一个单元格 多次 。

返回结果数组 answer 。
算法:
方法一:dfs 这个思路比较简单,但是TLE!

func maxPoints(grid [][]int, queries []int) []int {
    ans := make([]int, len(queries))
    row, col := len(grid), len(grid[0])
    visited := make([][]int, row)
    for i := range visited {
        visited[i] = make([]int, col)
    }
    
    dicts := [][]int{[]int{1,0},[]int{-1,0},[]int{0,1},[]int{0,-1}}
    
    var dfs func(i, j, target, visitFlag int) int
    dfs = func(i, j, target, visitFlag int) int {
        if 0 <= i && i < row && 0 <= j && j < col && visited[i][j] != visitFlag && grid[i][j] < target {
            visited[i][j] = visitFlag
            count := 1
            for _, dict := range dicts {
                x := dict[0] + i
                y := dict[1] + j
                count = count + dfs(x, y, target, visitFlag)
            }
            return count
        }
        return 0
    }
    for k := range queries {       
        ans[k] = dfs(0, 0, queries[k], k + 1) 
    }
    return ans
}

方法二: