Leetcode 134 加油站

2023-12-21 15:26:50

题意理解

????????给定n个站点,两个数组gas表达每个站点可加的油量,cost表达到下一站点所需耗费的油量。

????????gas = [1,2,3,4,5], cost = [3,4,5,1,2]

????????要求从下表为i的站点开始,刚好能支撑汽车在每个站点转一圈后回到出发位置。

????????

解题思路

? ? ? ? 当前站剩余油量累计-下一站耗油<0,行程被迫中止,前几站到到该站剩余的油量不足以支撑这几站的油量耗费,我们需要选择新的起始位置。

? ? ? ? 此时我们选择当前站的下一站作为起始站,重新开始。

注意

????????我们总是重复此过程。则不会出现到此处行程截止,但中间存在可完成行程的开始节点。

????????

? ? ? ? 假设

????????????????位置2处截止,开往下一节点剩余油<0,但是存在位置1处开始到位置2,开往下一节点后剩余油>0,

????????那么

????????????????必然存在位置0->位置1,从位置1开往下一节点剩余油<0,

????????因为

????????????????我们总是在开往下一节点剩余油<0时,更换起始节点

????????

????????????????从位置0-位置2,不存在一个可开始的位置1,使位置1到位置2,开往下一节点剩余油>0。

? ? ? ? 所以

? ? ? ? ? ? ? ? 当开往下一节点剩余油<0时,将当前节点的下一个节点作为起始节点是合理的。? ?

? ? ? ? 其次

????????????????若所有站点油和<所有路程耗费,则说明任何一个节点开始都无法完成形成,返回下标-1.

1.贪心解题

public int canCompleteCircuit(int[] gas, int[] cost) {
        int start=0;
        int curGos=0;
        int totalGos=0;
        for(int i=0;i< gas.length;i++){
            //当起始位置到此处时,开往下一节点剩余油<0,行程截止
            if(curGos<0){
                //更换起始位置,重新开始计算
                curGos=0;
                start=i;
            }
            curGos+=(gas[i]-cost[i]);
            totalGos+=(gas[i]-cost[i]);//记录所有行程耗油剩余量
        }
        //若所有节点耗油剩余量<0,则从任何节点开始都走不完行程。
        if(totalGos<0) return -1;
        return  start;
    }

2.分析

时间复杂度:O(n)

空间复杂度:O(1)

n表示输入数组的大小

文章来源:https://blog.csdn.net/lt_BeiMo/article/details/135126301
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。