第四天刷题:补给站最优花费问题-贪心 | 豆包MarsCode AI刷题

40 阅读2分钟

解题心得

在这道题中,小R每天需要补充食物,以确保每天都不会缺乏食物,并且要以最小的花费完成旅程。我的目标是找到一种既满足每天的需求,又能在购买食物时始终保持最低花费的策略。经过分析,我发现可以用滑动窗口贪心策略相结合的方法来解决这个问题。

1. 滑动窗口的应用

为了满足小R的携带上限 K,我引入了一个大小为 K 的滑动窗口来存储最近的 K 个补给站价格。滑动窗口的作用是帮助小R“记住”最近的 K 个站点,确保小R总是可以选择到当前最便宜的食物。每次遇到新的补给站,我们将其价格加入窗口,并在窗口超过 K 个价格时,删除最早进入窗口的价格。这样做的好处是可以始终保证小R的食物来源保持在 K 个站点内,不会超过携带上限。

2. 贪心策略选择最小价格

为使总花费最小,每次在窗口中选择价格最低的食物购买。这种贪心选择的策略保证了每一天的花费尽可能低。具体实现上,在当前窗口中,我们使用 Collections.min() 函数获取最小价格,将其累加到总花费中。窗口中的每次删除和查找操作,保证小R只在 K 个站点内选择食物,避免了不必要的高价购买。

3. 为什么不用堆?

一开始我考虑过用堆来维护一个实时的最小值,因为堆的插入、删除和查找最小值的复杂度较低。但堆的结构会带来维护上的复杂度增加,尤其是在需要删除特定的最早进入的元素时。滑动窗口的方式虽然需要每次线性查找最小值,但这样保持了代码的简单性,适合在 n 和 K 较小的情况下解决该问题。因此,我最终选择了滑动窗口加贪心选择的方法来达到最小花费的目标。

总结

通过这道题,我理解了如何在有限的资源(如携带的食物量)约束下利用滑动窗口来进行贪心选择,逐步逼近最优解。这种策略适合在需要固定数量元素选择的情况下使用。此外,我也学会了如何权衡算法的复杂性,在适合的场景中选择简单而高效的实现方式。