专业网站设计公司和普通设计公司的区别,丽江网络推广公司,做网站还有价值吗,wordpress的搭建环境搭建作者推荐
【动态规划】【map】【C算法】1289. 下降路径最小和 II
本文涉及知识点
大根堆 优先队列
LeetCode:871最低加油次数
汽车从起点出发驶向目的地#xff0c;该目的地位于出发位置东面 target 英里处。 沿途有加油站#xff0c;用数组 stations 表示。其中 statio…作者推荐
【动态规划】【map】【C算法】1289. 下降路径最小和 II
本文涉及知识点
大根堆 优先队列
LeetCode:871最低加油次数
汽车从起点出发驶向目的地该目的地位于出发位置东面 target 英里处。 沿途有加油站用数组 stations 表示。其中 stations[i] [positioni, fueli] 表示第 i 个加油站位于出发位置东面 positioni 英里处并且有 fueli 升汽油。 假设汽车油箱的容量是无限的其中最初有 startFuel 升燃料。它每行驶 1 英里就会用掉 1 升汽油。当汽车到达加油站时它可能停下来加油将所有汽油从加油站转移到汽车中。 为了到达目的地汽车所必要的最低加油次数是多少如果无法到达目的地则返回 -1 。 注意如果汽车到达加油站时剩余燃料为 0它仍然可以在那里加油。如果汽车到达目的地时剩余燃料为 0仍然认为它已经到达目的地。 示例 1 输入target 1, startFuel 1, stations [] 输出0 解释可以在不加油的情况下到达目的地。 示例 2 输入target 100, startFuel 1, stations [[10,100]] 输出-1 解释无法抵达目的地甚至无法到达第一个加油站。 示例 3 输入target 100, startFuel 10, stations [[10,60],[20,30],[30,30],[60,40]] 输出2 解释 出发时有 10 升燃料。 开车来到距起点 10 英里处的加油站消耗 10 升燃料。将汽油从 0 升加到 60 升。 然后从 10 英里处的加油站开到 60 英里处的加油站消耗 50 升燃料 并将汽油从 10 升加到 50 升。然后开车抵达目的地。 沿途在两个加油站停靠所以返回 2 。 参数 1 target, startFuel 109 0 stations.length 500 1 positioni positioni1 target 1 fueli 109
分析
加油站的位置已经按升序排序。 iCan 记录加油i次后能到达的最远位置。i 取值区间[0,stations.length] 第i1次加油一定是iPreCan(第i次加油的iCan)能到达且没有加油油量最大的加油站。 如果没有到达终点且无油可加返回-1。
代码
核心代码
class Solution {
public:int minRefuelStops(int target, int startFuel, vectorvectorint stations) {int iCan startFuel;priority_queueint canAdd;int j 0;for (int i 0; i stations.size(); i){if (iCan target){return i;}//canAdd能加油的加油站while ((j stations.size()) (stations[j][0] iCan)){canAdd.emplace(stations[j][1]);}if (canAdd.empty()){return -1;}iCan canAdd.top();canAdd.pop();}return (iCan target) ? stations.size() : -1;}
};测试用例
templateclass T
void Assert(const T t1, const T t2)
{assert(t1 t2);
}templateclass T
void Assert(const vectorT v1, const vectorT v2)
{if (v1.size() ! v2.size()){assert(false);return;}for (int i 0; i v1.size(); i){Assert(v1[i], v2[i]);}}int main()
{ int target, startFuel;vectorvectorint stations;{Solution sln;target 1, startFuel 1, stations {};auto res sln.minRefuelStops(target, startFuel, stations);Assert(res, 0);}{Solution sln;target 100, startFuel 1, stations { {10,100} } ;auto res sln.minRefuelStops(target, startFuel, stations);Assert(res, -1);}{Solution sln;target 100, startFuel 10, stations { {10, 60},{20, 30},{30, 30},{60, 40} };auto res sln.minRefuelStops(target, startFuel, stations);Assert(res, 2);} {Solution sln;target 100, startFuel 50, stations { {25, 25},{50, 50} };auto res sln.minRefuelStops(target, startFuel, stations);Assert(res, 1);}}2023年1月第一版
class Solution { public: int minRefuelStops(int target, int startFuel, vectorvector stations) { std::unordered_mapint,int preDp; preDp[0] startFuel; int iPrePos 0; for (auto v : stations) { std::unordered_mapint, int dp; for (auto pre : preDp) { const int iHasFuel pre.second - (v[0] - iPrePos); if (iHasFuel 0 ) { continue; } Add(dp, pre.first, iHasFuel); Add(dp, pre.first1, iHasFuel v[1]); } preDp.swap(dp); iPrePos v[0]; } int iMinNum INT_MAX; for (auto pre : preDp) { const int iHasFuel pre.second - (target - iPrePos); if (iHasFuel 0) { continue; } iMinNum min(iMinNum, pre.first); } return (INT_MAX iMinNum) ? -1 : iMinNum; } void Add(std::unordered_mapint, int dp, int iNum, int iFuel) { iFuel min(iFuel, 1000 * 1000 * 1000); auto it dp.find(iNum); if (dp.end() it) { dp[iNum] iFuel; } else { it-second max(it-second, iFuel); } } };
2023年1月 第二版
class Solution { public: int minRefuelStops(int target, int startFuel, vectorvector stations) { m_iFuel startFuel; for (auto v : stations) { Add(v[0]); if (m_iFuel v[0]) { return -1; } m_qFuel.push(v[1]); } Add(target); if (m_iFuel target) { return -1; } return stations.size() - m_qFuel.size(); } void Add(int iNeedFuel) { while (m_qFuel.size() (m_iFuel iNeedFuel)) { m_iFuel m_qFuel.top(); m_qFuel.pop(); } } std::priority_queue m_qFuel; int m_iFuel; };
2023年 8月版
class Solution { public: int minRefuelStops(int target, int startFuel, vectorvector stations) { stations.emplace_back(vector{target, 0}); int iRet 0; std::multiset setCanAdd; int iHas startFuel; for (const auto v : stations) { while (setCanAdd.size() (iHas v[0])) {//油不够需要加油 iHas *setCanAdd.rbegin(); setCanAdd.erase(std::prev(setCanAdd.end())); iRet; } if (iHas v[0]) { return -1; } setCanAdd.emplace(v[1]); } return iRet; } }; 扩展阅读
视频课程
有效学习明确的目标 及时的反馈 拉伸区难度合适可以先学简单的课程请移步CSDN学院听白银讲师也就是鄙人的讲解。 https://edu.csdn.net/course/detail/38771
如何你想快
速形成战斗了为老板分忧请学习C#入职培训、C入职培训等课程 https://edu.csdn.net/lecturer/6176
相关
下载
想高屋建瓴的学习算法请下载《喜缺全书算法册》doc版 https://download.csdn.net/download/he_zhidan/88348653
我想对大家说的话闻缺陷则喜是一个美好的愿望早发现问题早修改问题给老板节约钱。子墨子言之事无终始无务多业。也就是我们常说的专业的人做专业的事。如果程序是一条龙那算法就是他的是睛
测试环境
操作系统win7 开发环境 VS2019 C17 或者 操作系统win10 开发环境 VS2022 C17 如无特殊说明本算法用**C**实现。