Given an array of integers
In one step you can jump from index
i + 1 where:i + 1 < arr.length .i - 1 where:i - 1 >= 0 .j where:arr[i] == arr[j] andi != j .
Return the minimum number of steps to reach the last index of the array.
Notice that you can not jump outside of the array at any time.
Example 1:
Input: arr = [100,-23,-23,404,100,23,23,23,3,404] Output: 3 Explanation: You need three jumps from index 0 --> 4 --> 3 --> 9. Note that index 9 is the last index of the array.
Example 2:
Input: arr = [7] Output: 0 Explanation: Start index is the last index. You don't need to jump.
Example 3:
Input: arr = [7,6,9,6,9,6,9,7] Output: 1 Explanation: You can jump directly from index 0 to index 7 which is last index of the array.
Example 4:
Input: arr = [6,1,9] Output: 2
Example 5:
Input: arr = [11,22,7,7,7,7,7,7,7,22,13] Output: 3
Constraints:
1 <= arr.length <= 5 * 104 -108 <= arr[i] <= 108
Solution
除了正常的可以前後移動一個格的條件外
多了一個新條件,i can move to j when arr[i] = arr[j] && i != j
另外,題目要求的回傳不是是不是可以到達最後一個位置,而是最少的步數
一樣用 BFS 來解,但 queue 存的變成是 list of index
因為同一個步數下,可以有多個選擇
至於新條件的跳法,用一個 map 的方式來儲存,用過之後就刪掉
不刪掉會 TLE,因為會重複計算
kotlin
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Solution { | |
fun minJumps(arr: IntArray): Int { | |
val map = mutableMapOf<Int,MutableList<Int>>() | |
for(i in 1 until arr.size) { | |
if(map[arr[i]] == null) { | |
map[arr[i]] = mutableListOf<Int>(i) | |
} else { | |
map[arr[i]]!!.add(i) | |
} | |
} | |
var queue = mutableListOf<List<Int>>() | |
queue.add(listOf(0)) | |
var visited = mutableSetOf<Int>() | |
visited.add(0) | |
var ans = 0 | |
while(queue.isNotEmpty()) { | |
val paths = queue.first() | |
queue.removeAt(0) | |
val nextPath = mutableListOf<Int>() | |
for(index in paths) { | |
if(index == arr.lastIndex) { | |
return ans | |
} | |
if(map[arr[index]] != null) { | |
for(i in map[arr[index]]!!) { | |
if(!visited.contains(i)) { | |
visited.add(i) | |
nextPath.add(i) | |
} | |
} | |
map.remove(arr[index]) | |
} | |
if(index > 0 && !visited.contains(index-1)) { | |
visited.add(index-1) | |
nextPath.add(index-1) | |
} | |
if(index+1 < arr.size && !visited.contains(index+1)) { | |
visited.add(index+1) | |
nextPath.add(index+1) | |
} | |
} | |
queue.add(nextPath) | |
++ans | |
} | |
return ans | |
} | |
} |
沒有留言:
張貼留言