leetcode_lcp45_go_自行车炫技赛场

题目

「力扣挑战赛」中 N*M 大小的自行车炫技赛场的场地由一片连绵起伏的上下坡组成,

场地的高度值记录于二维数组 terrain 中,场地的减速值记录于二维数组 obstacle 中。

若选手骑着自行车从高度为 h1 且减速值为 o1 的位置到高度为 h2 且减速值为 o2 的相邻位置(上下左右四个方向),

速度变化值为 h1-h2-o2(负值减速,正值增速)。

选手初始位于坐标 position 处且初始速度为 1,请问选手可以刚好到其他哪些位置时速度依旧为 1。

请以二维数组形式返回这些位置。若有多个位置则按行坐标升序排列,若有多个位置行坐标相同则按列坐标升序排列。

注意: 骑行过程中速度不能为零或负值

示例 1:输入:position = [0,0], terrain = [[0,0],[0,0]], obstacle = [[0,0],[0,0]] 输出:[[0,1],[1,0],[1,1]]

解释:由于当前场地属于平地,根据上面的规则,选手从[0,0]的位置出发都能刚好在其他处的位置速度为 1。

示例 2:输入:position = [1,1], terrain = [[5,0],[0,6]], obstacle = [[0,6],[7,0]] 输出:[[0,1]]

解释:选手从 [1,1] 处的位置出发,到 [0,1] 处的位置时恰好速度为 1。

提示:n == terrain.length == obstacle.length

m == terrain[i].length == obstacle[i].length

1 <= n <= 100

1 <= m <= 100

0 <= terrain[i][j], obstacle[i][j] <= 100

position.length == 2

0 <= position[0] < n

0 <= position[1] < m

解题思路分析

1、深度优先搜索;时间复杂度O(n^2),空间复杂度O(n^2)

var dx = []int{0, 1, 0, -1}
var dy = []int{1, 0, -1, 0}
var res [][]int
var visited map[[3]int]bool
var n, m int
var originX, originY int

func bicycleYard(position []int, terrain [][]int, obstacle [][]int) [][]int {
   res = make([][]int, 0)
   n, m = len(terrain), len(terrain[0])
   originX, originY = position[0], position[1]
   visited = make(map[[3]int]bool)
   visited[[3]int{originX, originY, 1}] = true
   dfs(terrain, obstacle, originX, originY, 1)
   sort.Slice(res, func(i, j int) bool {
      if res[i][0] == res[j][0] {
         return res[i][1] < res[j][1]
      }
      return res[i][0] < res[j][0]
   })
   return res
}

func dfs(terrain [][]int, obstacle [][]int, i, j int, speed int) {
   if speed == 1 && (i == originX && j == originY) == false {
      res = append(res, []int{i, j})
   }
   for k := 0; k < 4; k++ {
      x, y := i+dx[k], j+dy[k]
      if 0 <= x && x < n && 0 <= y && y < m {
         // next = speed + h1-h2-o2
         next := speed + (terrain[i][j] - terrain[x][y] - obstacle[x][y])
         if next > 0 && visited[[3]int{x, y, next}] == false {
            visited[[3]int{x, y, next}] = true
            dfs(terrain, obstacle, x, y, next)
         }
      }
   }
}

2、广度优先搜索;时间复杂度O(n^2),空间复杂度O(n^2)

leetcode_lcp45_go_自行车炫技赛场

var dx = []int{0, 1, 0, -1}
var dy = []int{1, 0, -1, 0}

func bicycleYard(position []int, terrain [][]int, obstacle [][]int) [][]int {
   res := make([][]int, 0)
   n, m := len(terrain), len(terrain[0])
   originX, originY := position[0], position[1]
   visited := make(map[[3]int]bool)
   visited[[3]int{originX, originY, 1}] = true
   queue := make([][3]int, 0)
   queue = append(queue, [3]int{originX, originY, 1})
   for len(queue) > 0 {
      node := queue[0]
      queue = queue[1:]
      i, j, speed := node[0], node[1], node[2]
      if speed == 1 && (i == originX && j == originY) == false {
         res = append(res, []int{i, j})
      }
      for k := 0; k < 4; k++ {
         x, y := i+dx[k], j+dy[k]
         if 0 <= x && x < n && 0 <= y && y < m {
            // next = speed + h1-h2-o2
            next := speed + (terrain[i][j] - terrain[x][y] - obstacle[x][y])
            if next > 0 && visited[[3]int{x, y, next}] == false {
               visited[[3]int{x, y, next}] = true
               queue = append(queue, [3]int{x, y, next})
            }
         }
      }
   }
   sort.Slice(res, func(i, j int) bool {
      if res[i][0] == res[j][0] {
         return res[i][1] < res[j][1]
      }
      return res[i][0] < res[j][0]
   })
   return res
}

总结

Medium题目,相对于正常的判断坐标(x,y)是否遍历过,本题需要额外的速度信息来判断是否遍历过;采用深度优先搜索或者广度优先搜索

展开阅读全文

页面更新:2024-05-18

标签:自行车   升序   本题   负值   遍历   数组   示例   坐标   赛场   场地   排列   选手   题目   高度   速度   位置   科技

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top