解题思路:
一开始是想计算前i个加油站到达第i个需要最少加油次数,这种存在后效性,没法动态规划。从后面计算需要最少油也没法做。
正确做法是记录加i次油能到达的最大距离,这样到第i个加油站时,更新最大值,最后遍历得到答案。
class Solution { public int minRefuelStops(int target, int startFuel, int[][] stations) { int n=stations.length; int[] dp=new int[505]; dp[0]=startFuel; for(int i=0;i<n;i++){ for(int j=i+1;j>=1;j--){ if(dp[j-1]>=stations[i][0]){ dp[j]=Math.max(dp[j],dp[j-1]+stations[i][1]); } } } for(int i=0;i<=n;i++){ if(dp[i]>=target){ return i; } } return -1; } }
另一种做法是贪心,维护前i个加油站中油量最多的,每次无法到达时,取最大的加油,使用优先队列维护。
class Solution { public int minRefuelStops(int target, int startFuel, int[][] stations) { int n=stations.length; PriorityQueue<Integer> pq =new PriorityQueue<>((a,b)->b-a); int now=startFuel; int ans=0; for(int i=0;i<n;i++){ if(stations[i][0]<=now){ pq.offer(stations[i][1]); continue; } while(!pq.isEmpty()&&now<stations[i][0]){ now+=pq.poll(); ans+=1; } if(now<stations[i][0]){ return -1; } pq.offer(stations[i][1]); } while(!pq.isEmpty()&&now<target){ now+=pq.poll(); ans+=1; } if(now<target){ return -1; } return ans; } }
871. 最低加油次数
最新推荐文章于 2024-08-15 05:02:54 发布