import java.util.PriorityQueue class Solution { fun minRefuelStops( target: Int, startFuel: Int, stations: Array, ): Int { var maxReach = startFuel val availableRefuelling = PriorityQueue(reverseOrder()) var refuelled = 0 var i = 0 while (maxReach < target) { while (i < stations.size && stations[i][0] <= maxReach) { // keep track of possible refuels availableRefuelling.add(stations[i][1]) i++ } if (availableRefuelling.isEmpty()) { // no refuels are available and target has not been reached return -1 } // refuel at least once in order to progress maxReach += availableRefuelling.poll()!! refuelled++ } return refuelled } } fun main() { val s = Solution() check(s.minRefuelStops(1, 1, arrayOf()) == 0) check(s.minRefuelStops(100, 1, arrayOf(intArrayOf(10, 100))) == -1) check( s.minRefuelStops( 100, 10, arrayOf(intArrayOf(10, 60), intArrayOf(20, 30), intArrayOf(30, 30), intArrayOf(60, 40)), ) == 2, ) check( s.minRefuelStops( 1000, 299, arrayOf( intArrayOf(13, 21), intArrayOf(26, 115), intArrayOf(100, 47), intArrayOf(225, 99), intArrayOf(299, 141), intArrayOf(444, 198), intArrayOf(608, 190), intArrayOf(636, 157), intArrayOf(647, 255), intArrayOf(841, 123), ), ) == 4, ) }