NO.134 加油站 中等
在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i]
升。
思路一:暴力模拟 尝试每个加油站分别作为起点出发一次。
1 | public int canCompleteCircuit(int[] gas, int[] cost) { |
时间复杂度:O(n^2)
思路二:优化暴力解法 暴力中验证每个起点时,都要将所有加油站访问一遍,大量的重复计算。
这是可以优化的,当存在可行的方案时,起点 start 将这个环形路程分成了两部分 [0 -> start] 和 [start -> i],分别用 total 和 remain 记录这两部分剩余油量,最终的结果就是 total + remain >= 0。
- 让 start 从0开始、i遍历所有站点;
- 如果走到 i 点时油箱remain为负数,说明当前 [start -> i] 不可行,更新起点 start 为 i+1,那么之前 [start -> i] 路程计算的 remain 就成了的 [0 -> start] 的剩余油量 total;
- 继续从新的 start 向前走重新计算 走到 i 点时油箱 remain ,如果 remain 为负数,则说明新的 [start -> i]也不可行,更新起点 start 为 i+1,那么这段新的 [start -> i] 路程计算的 remain 就需要加入 [0 -> start] 的剩余油量 total;
- 直至 i 遍历完毕,计算最终 start 分割出的两部分 [0 -> start] 和 [start -> i] 分别剩余油量之和 total + remain ,如果大于等于 0 说明 start 为起点可行,否则不可行。
1 | public int canCompleteCircuit(int[] gas, int[] cost) { |
时间复杂度:O(n)
本人菜鸟,有错误请告知,感激不尽!
更多题解和源码:github