[LeetCode日记]871. 最低加油次数

91 阅读1分钟

题目描述及其数据范围

image.png

image.png

解题思路

这个题目虽然写明的是困难难度,但其实如果把思路理清,就很好思考了,就是一个简单的贪心问题,因为加油没有消耗,所以我们可以想象,对于任意一个点,如果我们当前的油足够到达下一个点(或者终点)时,按照贪心的想法,我们不需要再继续加油了,可以留到下一个点再考虑,而如果我们当前的油不足以到达下一个点,也就说明我们在之前的点中需要加若干次油,按照贪心的思想,则往前寻找一个油量最大的点,把油加上即可。而且从数据范围可以看到,我们甚至不需要维护优先队列,暴力搜索也可以很好的解决问题

解题代码

class Solution {
    public int minRefuelStops(int target, int startFuel, int[][] stations) {
        int nextX = startFuel,ans = 0,nowIndex = 0,maxFuelIndex = -1;
        int[][] nowStation = new int[stations.length][2];
        startFuel = 0;
        while(nextX < target)
        {
            while(nowIndex < stations.length&&stations[nowIndex][0] <= nextX)
            {
                nowIndex ++;
            }
            maxFuelIndex = -1;
            for(int i = 0;i < nowIndex; i++)
            {
                if(stations[i][1] > startFuel) 
                {
                    startFuel = stations[i][1];
                    maxFuelIndex = i;
                }
            }
            if(startFuel == 0) return -1;
            ans ++;
            nextX += startFuel;
            startFuel = 0;
            stations[maxFuelIndex][1] = 0;
        }
        return ans;
    }
}