diff --git a/leetcode/3301-3400/3342.Find-Minimum-Time-to-Reach-Last-Room-II/README.md b/leetcode/3301-3400/3342.Find-Minimum-Time-to-Reach-Last-Room-II/README.md index c2bf2798..b8b0e11c 100755 --- a/leetcode/3301-3400/3342.Find-Minimum-Time-to-Reach-Last-Room-II/README.md +++ b/leetcode/3301-3400/3342.Find-Minimum-Time-to-Reach-Last-Room-II/README.md @@ -1,28 +1,53 @@ # [3342.Find Minimum Time to Reach Last Room II][title] -> [!WARNING|style:flat] -> This question is temporarily unanswered if you have good ideas. Welcome to [Create Pull Request PR](https://github.com/kylesliu/awesome-golang-algorithm) - ## Description +There is a dungeon with `n x m` rooms arranged as a grid. + +You are given a 2D array `moveTime` of size `n x m`, where `moveTime[i][j]` represents the **minimum** time in seconds when you can **start moving** to that room. You start from the room `(0, 0)` at time `t = 0` and can move to an **adjacent** room. Moving between **adjacent** rooms takes one second for one move and two seconds for the next, **alternating** between the two. + +Return the **minimum** time to reach the room `(n - 1, m - 1)`. + +Two rooms are **adjacent** if they share a common wall, either horizontally or vertically. **Example 1:** ``` -Input: a = "11", b = "1" -Output: "100" +Input: moveTime = [[0,4],[4,4]] + +Output: 7 + +Explanation: + +The minimum time required is 7 seconds. + +At time t == 4, move from room (0, 0) to room (1, 0) in one second. +At time t == 5, move from room (1, 0) to room (1, 1) in two seconds. +``` + +**Example 2:** + ``` +Input: moveTime = [[0,0,0,0],[0,0,0,0]] + +Output: 6 -## 题意 -> ... +Explanation: -## 题解 +The minimum time required is 6 seconds. -### 思路1 -> ... -Find Minimum Time to Reach Last Room II -```go +At time t == 0, move from room (0, 0) to room (1, 0) in one second. +At time t == 1, move from room (1, 0) to room (1, 1) in two seconds. +At time t == 3, move from room (1, 1) to room (1, 2) in one second. +At time t == 4, move from room (1, 2) to room (1, 3) in two seconds. ``` +**Example 3:** + +``` +Input: moveTime = [[0,1],[1,2]] + +Output: 4 +``` ## 结语 diff --git a/leetcode/3301-3400/3342.Find-Minimum-Time-to-Reach-Last-Room-II/Solution.go b/leetcode/3301-3400/3342.Find-Minimum-Time-to-Reach-Last-Room-II/Solution.go index d115ccf5..93fc724f 100644 --- a/leetcode/3301-3400/3342.Find-Minimum-Time-to-Reach-Last-Room-II/Solution.go +++ b/leetcode/3301-3400/3342.Find-Minimum-Time-to-Reach-Last-Room-II/Solution.go @@ -1,5 +1,63 @@ package Solution -func Solution(x bool) bool { +import "container/heap" + +type heap3342 [][4]int + +func (h *heap3342) Len() int { + return len(*h) +} + +func (h *heap3342) Swap(i, j int) { + (*h)[i], (*h)[j] = (*h)[j], (*h)[i] +} + +func (h *heap3342) Less(i, j int) bool { + return (*h)[i][2] < (*h)[j][2] +} + +func (h *heap3342) Push(x any) { + *h = append(*h, x.([4]int)) +} + +func (h *heap3342) Pop() any { + old := *h + l := len(old) + x := old[l-1] + *h = old[:l-1] return x } + +var dirs3342 = [][2]int{ + {0, 1}, {0, -1}, {-1, 0}, {1, 0}, +} + +func Solution(moveTime [][]int) int { + m, n := len(moveTime), len(moveTime[0]) + h := heap3342{{0, 0, 0, 1}} + visited := map[[2]int]struct{}{ + [2]int{0, 0}: {}, + } + for h.Len() > 0 { + top := heap.Pop(&h).([4]int) + if top[0] == m-1 && top[1] == n-1 { + return top[2] + } + for _, dir := range dirs3342 { + nx, ny := top[0]+dir[0], top[1]+dir[1] + if nx >= 0 && nx < m && ny >= 0 && ny < n { + if _, ok := visited[[2]int{nx, ny}]; !ok { + visited[[2]int{nx, ny}] = struct{}{} + cost := moveTime[nx][ny] + if cost <= top[2] { + cost = top[2] + top[3] + } else { + cost += top[3] + } + heap.Push(&h, [4]int{nx, ny, cost, 3 - top[3]}) + } + } + } + } + return -1 +} diff --git a/leetcode/3301-3400/3342.Find-Minimum-Time-to-Reach-Last-Room-II/Solution_test.go b/leetcode/3301-3400/3342.Find-Minimum-Time-to-Reach-Last-Room-II/Solution_test.go index 14ff50eb..d4d6d8ce 100644 --- a/leetcode/3301-3400/3342.Find-Minimum-Time-to-Reach-Last-Room-II/Solution_test.go +++ b/leetcode/3301-3400/3342.Find-Minimum-Time-to-Reach-Last-Room-II/Solution_test.go @@ -10,12 +10,12 @@ func TestSolution(t *testing.T) { // 测试用例 cases := []struct { name string - inputs bool - expect bool + inputs [][]int + expect int }{ - {"TestCase", true, true}, - {"TestCase", true, true}, - {"TestCase", false, false}, + {"TestCase1", [][]int{{0, 4}, {4, 4}}, 7}, + {"TestCase2", [][]int{{0, 0, 0, 0}, {0, 0, 0, 0}}, 6}, + {"TestCase3", [][]int{{0, 1}, {1, 2}}, 4}, } // 开始测试 @@ -30,10 +30,10 @@ func TestSolution(t *testing.T) { } } -// 压力测试 +// 压力测试 func BenchmarkSolution(b *testing.B) { } -// 使用案列 +// 使用案列 func ExampleSolution() { }