题:https://leetcode.com/problems/minimum-number-of-refueling-stops/

题目大意

起点有油 startFuel 的车,想行驶到 终点 target位置。途中有多个加油站 station 可以加油,其中station[0] 表示与起点的距离,station[1]表示可以加的油,且 车在行驶过程中必须保持 油 >=0 。
求车能到达target的最少加油数,若不能达到 返回 -1。

思路

整个行驶过程十分像 0 -1 背包选择问题,对于每个加油站选择是否加油。

状态:
dp[i][j] : 经过 i 个加油站,加了 j 次油后,车能行驶的最远距离。

初始化状态:
dp[i][0] = startFuel ,若全程 未加油,那么车能行驶的里程便是 最初油startFuel 的 距离。

状态转移:
dp[i][j] = max(dp[i-][j], dp[i-1][j-1] + stations[i-1][1] if dp[i-1][j-1] >= stations[i-1][0] else 0)

这里的意思是:若在 i 加油站不加油,那么 dp[i][j] = dp[i-][j],若选择加油 且 dp[i-1][j-1] >= stations[i-1][0] ,那么 dp[i][j] = max(dp[i-][j], dp[i-1][j-1] + stations[i-1][1] if dp[i-1][j-1] )

最后我们只用看 dp[stations.length][j]>= target 中的 最小 j 。

class Solution {public int minRefuelStops(int target, int startFuel, int[][] stations) {int N = stations.length;int[][] dp = new int[N+1][N+1];for(int i =0 ;i <= N ;i++)dp[i][0] = startFuel;for(int  i = 1 ; i <= N ;i++)for(int j = 1 ; j <=N; j++){dp[i][j] = dp[i-1][j];if(dp[i-1][j-1] >= stations[i-1][0])dp[i][j] = Math.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;}
}

0-1 背包 的典型压缩

class Solution {public int minRefuelStops(int target, int startFuel, int[][] stations) {PriorityQueue<Integer> pq = new PriorityQueue(new Comparator<Integer>(){public int compare(Integer o1,Integer o2){return o2 - o1;}});int dis = startFuel;int cnt = 0;int index = 0;while(true){if(dis >= target)return cnt;while(index < stations.length && stations[index][0] <= dis){pq.add(stations[index++][1]);}if(pq.isEmpty())break;dis += pq.peek();pq.poll();cnt++;}return -1;}
}

方法二 贪心

车行驶,若车到达target,那么返回当前的加油次数。
若没有 用 大顶堆 记录 在油耗尽时 经过的 加油站,并将该加油站的加油数加入大顶堆中。
取 最大的 加油量 作为 车 能 增加的里程数数,继续上部操作。
当 大顶堆为空时,返回 -1
这里是用的贪心,不断去 反悔,假设 我们 取了 经过的 最好的加油站。

class Solution {public int minRefuelStops(int target, int startFuel, int[][] stations) {PriorityQueue<Integer> pq = new PriorityQueue(new Comparator<Integer>(){public int compare(Integer o1,Integer o2){return o2 - o1;}});int dis = startFuel;int cnt = 0;int index = 0;while(true){if(dis >= target)return cnt;while(index < stations.length && stations[index][0] <= dis){pq.add(stations[index++][1]);}if(pq.isEmpty())break;dis += pq.peek();pq.poll();cnt++;}return -1;}
}

[LeetCode] 871. Minimum Number of Refueling Stops相关推荐

  1. LeetCode 871. Minimum Number of Refueling Stops 最少加油次数

    LeetCode 871. Minimum Number of Refueling Stops 本题是LeetCode 871题,最少加油次数. 题目描述 A car travels from a s ...

  2. LeetCode: 871. Minimum Number of Refueling Stops

    LeetCode: 871. Minimum Number of Refueling Stops 题目描述 A car travels from a starting position to a de ...

  3. [LeetCode] 871. Minimum Number of Refueling Stops @ python

    一.题目: 初始油量startFuel,给一个到达目的地所需的油量target,还有沿途的加油站stations(包括到达加油站所需油量以及储备的油量),求达到目的地所需的最少加油次数,如果到不了返回 ...

  4. LeetCode刷题:871. Minimum Number of Refueling Stops

    LeetCode刷题:871. Minimum Number of Refueling Stops 原题链接:https://leetcode.com/problems/minimum-number- ...

  5. 871. Minimum Number of Refueling Stops

    题目: A car travels from a starting position to a destination which is target miles east of the starti ...

  6. 【LeetCode】871. Minimum Number of Refueling Stops 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 贪心算法 日期 题目地址:https://leetc ...

  7. 算法练习14:leetcode习题871. Minimum Number of Refueling Stops

    文章目录 题目 算法思路 C++代码 题目 A car travels from a starting position to a destination which is target miles ...

  8. LeetCode:871. Minimum Number of Refueling Stops - Python

    问题描述: 871. 最低加油次数 汽车从起点出发驶向目的地,该目的地位于出发位置东面 target英里处. 沿途有加油站,每个station[i] 代表一个加油站,它位于出发位置东面 station ...

  9. 【Leetcode】871. Minimum Number of Refueling Stops

    题目地址: https://leetcode.com/problems/minimum-number-of-refueling-stops/description/ 有一个小车,初始位置在 0 0 0 ...

最新文章

  1. 如何利用大数据指导市场营销
  2. vmware 共享文件夹(win10下的vmware安装了centos7)
  3. python3 %%time 表示执行单元格时间 时间指的是CPU时间
  4. 用 Flask 来写个轻博客 (6) — (M)VC_models 的关系(one to many)
  5. 十个简单好用的设计技巧[SM]
  6. 芯片项目谁支持谁负责 重大损失将予以通报
  7. 计算机图形学——阴影
  8. qt +ChartDirector 绘制图表
  9. Openstack 笔记概要
  10. Jmeter中的Bean shell
  11. womic网络错误_wo mic 电脑版下载-WO Mic Client下载 3.4 最新电脑版 - 河东下载站
  12. xp系统怎样安装传真服务器,ghost xp安装传真服务教程
  13. 基于树莓派的sht20温湿度传感器应用(c语言)
  14. 微信公众号开发详细过程(亲手总结)
  15. qq邮箱foxmail imap服务器,Foxmail如何设置IAMP邮箱
  16. jQuery 选择城市,显示对应的即时时区时间
  17. C++特征码查找 附加案例
  18. 如何为谷歌浏览器启用暗模式
  19. 渗透测试-流量加密之冰蝎蚁剑
  20. 手动清除jwgkvsq.vmx病毒

热门文章

  1. 服务器默认管理口登录信息(默认IP、用户名、密码)大全
  2. 三大通信运营商天猫电器城开店
  3. 【牛客网华为机试】HJ89 24点运算
  4. 【教3妹学算法-每日3题(3)】 和至少为 K 的最短子数组
  5. 最简单的uefi和legacy介绍和举例(可能吧?)
  6. scratch五彩糖葫芦 电子学会图形化编程scratch等级考试三级真题和答案解析2022年6月
  7. 五子棋 java 课设,五子棋java课程设计
  8. 大型门户网站的十四大技术
  9. 高级计算机网络管理员试题及答案,2016年计算机软考网络管理员测试题及答案...
  10. stata:应用stata学习计量经济学原理 practice 2 stata绘图基础