贪心之加油站

力扣1220

package com.zhang.reflection.面试.算法模版.贪心算法;
/**
 * 在一条环路上有 n 个加油站,其中第 i 个加油站有 gas[i] 升油,假设汽车油箱容量无限,
 * 从第 i 个加油站驶往第 (i+1)%n 个加油站需要花费 cost[i] 升油。
 *
 * 请问能否绕环路行驶一周,如果可以则返回出发的加油站编号,如果不能,则返回 -1。
 * 题目数据可以保证最多有一个答案。
 *
 * [1,2,3,4,5],[3,4,5,1,2]
 * 3
 */
public class 加油站 {
    /**
     * 选择出发点,累加计算每一站得到的汽油量和消耗的汽油量,一旦有
     *
     * sumCost > sumGas,就需要遍历下一个起始节点,但是这里需要用到贪心算法,否则会超出时间限制。
     *
     * 假设有两个站点x和y,如果x到不了y+1(但能到y),那么从x到y的任一点出发都不可能到达y+1。原因如下:
     *
     * 设x、y之间一点为a,从x出发到y积累的油一定比从a出发到y积累的油多,因为从x出发到a积累的油一定是非负的,
     * 设remain表示积累的油,即remain(x -> y) = remain(x -> a) + remain(a -> y),因为都能到达,三项都是非负的,
     * 必然有remain(x -> y) >= remain(a -> y),因此a点必然到不了y+1,所以在以下的代码中,不能是i += 1,而是i += count + 1,
     * 直接跳过中间count个节点。
     */
    public int gasStation (int[] gas, int[] cost) {
        // write code here
        int n=gas.length;
        int rest=0;
        int start=0,sum=0;
        for(int i=0;i<n;i++){
            rest+=gas[i]-cost[i];
            sum+=gas[i]-cost[i];
            if(rest<0){
                start=(i+1)%n;
                rest=0;
            }
        }
        return sum>=0?start:-1;
    }
}
全部评论

相关推荐

06-04 09:27
门头沟学院 Java
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-16 18:03
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务