2022-10-22 【我的刷题日记】134 加油站

思路:这题题目描述挺复杂的,简化一下其实就是这个意思,我们需要走过每一个加油站,每个加油站可以加固定数量的油,开到下一个加油站也需要消耗固定数量的油,判断从哪一个加油站出发可以成功走完所有加油站,这里的加油和耗油的数组可以看成是循环队列 因为从末尾出发也能直接到开头。
那么我们首先可以判断是否具有能成功走完的必要条件 即总加油的量要大于总耗油的量,如果不满足这个条件 从哪个地方出发都是无效的
判断完之后,此时题目提供的条件是足够成功走完所有加油站的,我们需要判断从哪个地方出发是合适的。我们知道每个加油站的加油和耗油是有差值的,我们从第一个开始遍历,并用一个累加器记录这些差值的累加,如果出现负数,那么就从这个加油站的下一个站出发并且重置累加器的值。(总加油一定大于总耗油,如果一个区间之内出现耗油大于加油,那么就不能从这个区间出发,而是从下一个区间出发,因为下一个区间内加油一定会大于耗油,累加器就是用来判断这个区间的)

class Solution {
    public int canCompleteCircuit(int[] gas, int[] cost) {
//        先计算耗油和加油的总和 如果总耗油大于总加油则一定不行
        int gasTotal = Arrays.stream(gas).sum();
        int costTotal = Arrays.stream(cost).sum();
        int start = 0;
        int sum = 0;
        if (costTotal > gasTotal) return -1;
//        此时总加油一定大于等于总耗油 一定能跑完 则需要选择合适的起始位置
        for (int i = 0 ; i < gas.length;i++){
//            从0开始计算累加的差值
            sum += gas[i]-cost[i];
//            如果差值小于0 则说明这段区间不能作为起点 需要从下一个点开始重新计算
//            因为gastotal一定大于costtotal 这段区间累加差小于0 后面区间一定大于0
            if (sum < 0){
                start = i+1;
//                sum重置为0
                sum = 0;
            }
        }
        return start;
    }
}

你可能感兴趣的:(2022-10-22 【我的刷题日记】134 加油站)