加油站——贪心

113 阅读1分钟

image.png

代码贪心:

  1. 遍历每一个加油站,判断是否可以绕环路一圈
  2. 但可以发现,从 a 点起,最多到达 b 点,两点中间的 点,最多也是到达 b 点
  3. 故而我们从 0 开始遍历,找到最远可以到达的位置,我们从这个最远位置接着往下遍历,其中间的点位无需判断
  4. sumofgas 表示当前位置为止所得到的总油量,sumofcost 表示往下一个加油站为止所需要消耗的总油量,所以当前者小于后者则到不了下一个位置,跳出循环,
  5. cut 作为计数变量,计算当前通过了几个加油站,我们的目的是让cnt 等于 n,也就是满足绕一圈,
  6. j 表示当前所在的位置,j 通过(i + cnt) % n得到,因为保证模拟绕圈
  7. 跳出循环后判断是因为什么跳出循环的, 做出对应的操作,
func canCompleteCircuit(gas []int, cost []int) int {
    for i, n := 0, len(gas); i < n; {
        sumOfGas, sumOfCost, cnt := 0, 0, 0
        for cnt < n {
            j := (i + cnt) % n
            sumOfGas += gas[j]
            sumOfCost += cost[j]
            if sumOfCost > sumOfGas {
                break
            }
            cnt++
        }
        if cnt == n {
            return i
        } else {
            i += cnt + 1
        }
    }
    return -1
}