今天的小技巧:最少加油次数的方法
今天和闺蜜聊天,问我为啥很久没更新文章了,说她一直关注我。
其实最近有在学习,但是不知道写什么,感觉自己的知识面太宅了,深度也非常的欠缺。
写一个算法的题解吧
题目
[题目来源]:871. 最低加油次数(leetcode)
汽车从起点出发驶向目的地,该目的地位于出发位置东面 target 英里处。
沿途有加油站,每个 station[i] 代表一个加油站,它位于出发位置东面 station[i][0] 英里处,并且有 station[i][1] 升汽油。
假设汽车油箱的容量是无限的,其中最初有 startFuel 升燃料。它每行驶 1 英里就会用掉 1 升汽油。
当汽车到达加油站时,它可能停下来加油,将所有汽油从加油站转移到汽车中。
为了到达目的地,汽车所必要的最低加油次数是多少?如果无法到达目的地,则返回 -1 。
注意:如果汽车到达加油站时剩余燃料为 0,它仍然可以在那里加油。如果汽车到达目的地时剩余燃料为 0,仍然认为它已经到达目的地。
答案
var minRefuelStops = function(target, startFuel, stations) {
const n = stations.length;
// 记录每次加油后可到达的距离
const dp = new Array(n + 1).fill(0);
dp[0] = startFuel;
for(let i = 0; i < n; i++) {
const [curStation, curFuel] = stations[i];
// 到j站点可以到达的距离
let j = i;
while(j >= 0 && dp[j] >= curStation) {
dp[j + 1] = Math.max(dp[j + 1], dp[j] + curFuel);
console.log(i, j, dp);
j--;
}
}
return dp.findIndex(item => item >= target);
};
分析
核心思路:最小的加油次数,到达最远的距离。
在到达本站点的时候,我们可以选择加油或者不加油,加油与不加油是有下一个站点是否能到达决定。
那我们就可以换种思考方式,假设到本站点都加油(记录加油和的距离),但后再看前面的j次加油,是否也能到达本站点,如果能则可以拿到本次的油量(这样说有点抽象,可以看下面的举例说明)
那首先我们可以声明一个变量dp保存第i次加油后能到达的距离,第0次加油的值就为startFuel。
举例说明:
target = 100, startFuel = 10, stations = [[10, 20], [20, 30], [30, 40], [60, 50]]
i | j | curStation | curFuel | dp | 备注 |
---|---|---|---|---|---|
- | - | - | - | [10, 0, 0, 0, 0] | |
0 | 0 | 10 | 20 | [10, 30, 0, 0, 0] | |
1 | 1 | 20 | 30 | [10, 30, 60, 0, 0] | |
1 | 0 | 20 | 30 | [10, 30, 60, 0, 0] | 不会进入while, dp[0] < 20 |
2 | 2 | 30 | 40 | [10, 30, 60, 100, 0] | |
2 | 1 | 30 | 40 | [10, 30, 70, 100, 0] | |
2 | 0 | 30 | 40 | [10, 30, 70, 100, 0] | 不会进入while, dp[0] < 30 |
3 | 3 | 60 | 50 | [10, 30, 60, 100, 150] | |
3 | 2 | 60 | 50 | [10, 30, 70, 110, 150] | |
3 | 1 | 60 | 50 | [10, 30, 70, 110, 150] | 不会进入while, dp[1] < 30 |
今天的内容就到这儿吧,想想后面的计划
上一篇: 双十一云大使拼团全攻略:让你红包拿不停!
下一篇: 探讨B站站内消息系统的设计,以实例分析
推荐阅读
-
玩转模运算!了解常见的求模方法:加减乘除小技巧,费马定理与欧拉降幂
-
今天的小技巧:最少加油次数的方法
-
揭秘两大游戏内常见物品获取方法的隐藏小技巧
-
微信语音转发朋友圈的方法(微信小技巧 1)
-
今天,我要与大家分享我在 Chatgpt 和 Ai 绘画与航海中学到的一个小技巧!
-
刘韧工作手册(2023年版)-17 共同学习,共同进步,搭建共识。一起工作的基础,是对彼此能力的认可,继续一起工作的基础,是能力的共同提高。共同进步的基础,就是共同学习,共同学习的基础,是看过同样的书。 年轻时,男女谈恋爱,双方世界观趋同,差距不大。后来,世界观逐渐拉大,对话成了鸡同鸭讲,我讲,你听不懂。你讲,我不感兴趣,甚至闹离婚,双方自然而然走不下去了。工作也一样,同事间如果差距越来越大,最终,无法一起工作。 我为了和别人搭建共识,会处心积虑向其推荐读书。听什么歌,观什么电影,看什么书,能在一定程度了解一个人。 有人说,金庸的书是文学。我说,那是娱乐。文学是“真、善、美”,首先是要“真”,就是情感真实。而在金庸的小说里,类似“九阴真经”、“葵花宝典”的秘籍是假的,小说里的人物寻得秘籍,一夜之间就能武功猛增……这样的情节,在现实中可能吗?生活中,漂亮的富家女黄蓉会爱上傻小子郭靖吗?金庸看多了,人会追求走捷径,工作生活“走捷径”会害死自己。 18 礼物,是人际交往中的情感润滑剂。互相送礼物,增进感情。不知道买什么,就买吃的。 英国人做客,会送主人红酒、鲜花和小卡片,回家后,会写感谢信。在新加坡,朋友们来家,常带些做好的熟食,大家一起吃。 2000年,我听说谷歌在办公室给员工备吃的。当时不太理解,后来才知道,“在一起吃”这个行为,有助于消除紧张和敌意,人更容易感到温暖和轻松,更愿意敞开心扉,是社交中增进感情的好方式之一。脸书新加坡总部,午餐,公司会请高级厨师做六种风格的菜,每一道菜都做的极好,甚至比五星级酒店的饭菜都好吃。他们的员工告诉我,根本不想回家,就想在公司吃饭。 19 坦诚,不装懂,打破沙锅问到底。想当然半天,不如简单试一下。要学会积攒各种低成本测试方法,并勤快地去试。超大额跨国汇款,先汇1元,测试路径是否畅通。没有招,没有策略库,一筹莫展。 有句古话,叫“以其昏昏,使人昭昭”。很多人对“学而优则仕”这句话的理解,是典型的“以其昏昏,使人昭昭”。这句话常被人解释为“学习好了就去当官”,若照此解释,下一句“仕而优则学”只能解释为“当官当好了就去学习”!这显然说不通。这里的“优”,不是“优秀”,而是“空闲”的意思。很多人不清楚,却到处教人解释这句话。 《水浒传》是中国版的黑帮小说,讲的是厚黑学,没有道德底线。梁山人为了拉扈三娘入伙,杀光了她全家,把原本是千金小姐,花容月貌的扈三娘指婚丑陋的王英。直到今天,《水浒传》常被解释为“侠义”。 在群里,遇到信口雌黄国学的人,我会问他们,论语中,第一句话“学而时习之不亦说乎”中的“习”是什么意思?很多人解释为“复习”。其实,繁体字中,“习”的写法是“習”,下面一个“白”,上面一个“羽”,指的是“雏鸟学飞”。意思是,雏鸟利用老鸟教的技巧,终于飞起来了。因此,“习”的本意是指老师手把手把心得教给你,让你学会了,有了收获和进步,绝不是指反复“复习”和“练习”的意思。 维特根斯坦说:“凡是可说的就要说清楚,凡是不可说的就该保持沉默。”别不懂装懂。 20 善待帮助你的人。一个人能否成功,要看有没有人愿意帮你。有多大成功,要看有多少人愿意帮你。 别人发现你出错了,提醒你,这些都是你所能得到的“举手之劳”的帮助,你知道了,能改掉,你容易成长。 如何做一个有很多人愿意帮你的人呢? 首先,滴水之恩,当涌泉相报。每次收到礼物,我一定会表示感谢。 其次,得到帮助,一定要反馈。很多帮助不一定非得要你用物质来交换,可能仅仅是你要领情。我会记录所有受到的帮助,并广而告之。我写书时,会把帮助我的人都列举出来,这样做成本不高,但被提到的人会感动。 你们可以回忆一下,有多少人帮过你?如果脱口说出的人数越多,说明你离成功越近。要是发现世界上,愿意帮你的人只有父母,那就要反思了。(完) 刘韧商业写作通识
-
设计师助手 设计师助手<精品辅助软件下载集锦>,值得收藏!~~ 一些技巧性很强的小软件,因为操作简单给我们带来了很大的方便,它们虽然没有像Photoshop、FLash等功能那么强大,但在某些方面却有非常实用的功能,为我们节省了很多时间,有些软件比较少见也不容易找到,为了方便大家整理出今天比较实用的几款,并贴出了下载网址,希望能够对大家有所帮助! 图片设计类 无损缩放图片软件 PhotoZoomPro 下载地址 http://www.webshu.net/Soft/soft/
-
MAX_LEN) {
int pivot = partition(arr, left, right);
quicksort_optimized(arr, left, pivot - 1);
quicksort_optimized(arr, pivot + 1, right);
} else {
// 使用插入排序处理小数组
}
}
```
- 合并相同值进行分割:在每次划分后,我们将与枢轴相等的元素聚集在一起,以降低后续迭代中的重复处理。例如:
原序列: 1 4 6 7 6 6 7 6 8 6
- 选取枢轴(6)并划分:1 4 6 7 1 6 7 6 8 6
- 划分结果(未处理相等项):1 4 6 6 7 6 7 6 8 6
- 处理相等项后的划分结果:1 4 6 6 6 6 7 8 7
- 下次划分得到的子序列:1 4 和 7 8 7
通过这样的优化,我们可以明显减少迭代次数,从而提高排序效率。">
改进版快速排序:针对部分有序列的策略与优化技巧" - 随机选枢轴:当数据部分有序时,传统快速排序通过固定枢轴可能导致效率低下。为此,我们采用随机选取枢轴的方法,代码如下: ```c int SelectPivotRandom(int arr[], int low, int high) { srand(time(0)); int pivotPos = (rand() % (high - low)) + low; swap(arr[pivotPos], arr[low]); return arr[low]; } ``` - 优化小数组交换:针对小且部分有序的数组,快速排序不如插入排序高效。因此,当待排序序列长度小于等于10时,我们会切换至插入排序: ```c #define MAX_LEN 10 void quicksort_optimized(int *arr, int left, int right) { int length = right - left; if (length > MAX_LEN) { int pivot = partition(arr, left, right); quicksort_optimized(arr, left, pivot - 1); quicksort_optimized(arr, pivot + 1, right); } else { // 使用插入排序处理小数组 } } ``` - 合并相同值进行分割:在每次划分后,我们将与枢轴相等的元素聚集在一起,以降低后续迭代中的重复处理。例如: 原序列: 1 4 6 7 6 6 7 6 8 6 - 选取枢轴(6)并划分:1 4 6 7 1 6 7 6 8 6 - 划分结果(未处理相等项):1 4 6 6 7 6 7 6 8 6 - 处理相等项后的划分结果:1 4 6 6 6 6 7 8 7 - 下次划分得到的子序列:1 4 和 7 8 7 通过这样的优化,我们可以明显减少迭代次数,从而提高排序效率。
-
如何轻松拍摄电子版身份证照片?来试试这两种实用的小技巧 - 方法二推荐
-
Excel技巧75:轻松掌握计算当前值与上次数值差异的方法