美文网首页
871. 最低加油次数

871. 最低加油次数

作者: 漫行者_ | 来源:发表于2021-11-26 22:47 被阅读0次

871. 最低加油次数

很好的题目,不管是动态规划还是最大堆。
最大堆

class Solution {
    public int minRefuelStops(int target, int startFuel, int[][] stations) {
       int sum = startFuel;
       Queue<Integer> maxHeap = new PriorityQueue<>((e1,e2)->{
           return e2-e1;
       });
       int n = stations.length;
       int res =0;
       for(int i=0; i<n; i++){
           while(sum < stations[i][0]) {
               if(maxHeap.size() == 0) {
                   return -1;
               }
               sum += maxHeap.poll();
               res++;
           }
            maxHeap.add(stations[i][1]);
       }
        while(sum < target) {
            if(maxHeap.size() == 0) {
                   return -1;
            }
            sum += maxHeap.poll();
            res++;
        }
        return res;

    }
}

动态规划

 int minRefuelStops(int target, int startFuel, vector<vector<int>>& stations) {
        if(startFuel>=target)
            return 0;
        int n=stations.size();
        //dp[i][j]为经过了i个加油站、加了j次油能跑的最远距离(当然0<=j<=i)
        //vector<vector<int>> dp(n+1,vector<int> (n+1,0));
        //用二维int dp数组会在提交时发现在一个测试案例中两根整型相加
        //超过了INT_MAX而溢出报错,故这里换用long
        //因不支持vector<vector<long>> dp(n+1,vector<int> (n+1,0)); 
        //故换用下面四行来实现
        long dp[n+1][n+1];  
        for(int i=0;i<n+1;++i)
            for(int j=0;j<n+1;++j)
                dp[i][j]=0; //dp数组初始化
        
        //开成n+1的长度是因为把起点视为第0个加油站:起始状态处理
        for(int i=0;i<n+1;++i)
            dp[i][0]=startFuel; //甭管经过了几个站,一次油也不加那最多跑的就是startFuel的距离
        
        for(int i=1;i<n+1;++i)
        {
            for(int j=1;j<=i;++j)
            {
                if(dp[i-1][j]>=stations[i-1][0])  //在第i站不加油
                    dp[i][j]=dp[i-1][j];
                if(dp[i-1][j-1]>=stations[i-1][0]) //在第i站加油
                    dp[i][j]=max(dp[i][j],dp[i-1][j-1]+stations[i-1][1]); //加油与否两种情况取大者
            }
        }

        for(int j=0;j<=n;++j)
            if(dp[n][j]>=target)
                return j;
        return -1;
    }

相关文章

  • 871. 最低加油次数

    871. 最低加油次数[https://leetcode-cn.com/problems/minimum-numb...

  • LeetCode-python 871.最低加油次数

    题目链接难度:困难 类型: 贪心算法、动态规划 汽车从起点出发驶向目的地,该目的地位于出发位置...

  • LeetCode871 最低加油次数

    题目描述 汽车从起点出发驶向目的地,该目的地位于出发位置东面 target英里处。 沿途有加油站,每个statio...

  • 贪心算法-最优加油方法

    题目 思路 题目要求最少加油次数,为了加油次数最少,我们需要考虑下面的问题 什么时候加油能使得加油次数最少?当油用...

  • 把喝酒次数降到最低

    以下丁香医生的文章值得一读: 这个专坑中国人的「健康建议」,你一定听过 2018年07月30日 13:57:07 ...

  • 【教3妹学算法-每日3题(3)】最低加油次数

    插: 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。[http...

  • 团油开始收割了

    用团油差不多两年了,上次加油返现(即下次加油的优惠)1.23元,是两年来返现的最低额。 翻看两年来的返现记录,最低...

  • 2018-09-13

    今天要的资源创历史最低了,好好反思怎么回事,命题加油!

  • 2018-09-13

    今天要的资源创历史最低了,好好反思怎么回事,明天加油!

  • 每天进步一点点,成功就在不远处

    亲爱的孩子们,加油,这是第三次数学测试,好多人都在90分以上,你们真棒,我爱你们! 加油。

网友评论

      本文标题:871. 最低加油次数

      本文链接:https://www.haomeiwen.com/subject/pitfxrtx.html