134. 加油站

贪心

import java.util.Arrays;

class Solution {
    public int canCompleteCircuit(int[] gas, int[] cost) {

        /**
         * 如果总的油量小于总的消耗量,那肯定无法跑一圈
         */
        if (Arrays.stream(gas).sum() - Arrays.stream(cost).sum() < 0){
            return -1;
        }

        int n = gas.length;
        int start = 0;
        int sum = 0;

        /**
         * 从第一个加油站开始跑,每到一个加油站就统计总的剩余油量
         * 如果大于等于0那就可以接着跑
         * 如果小于0说明当前选的起始位置不对,将下一个加油站设置为新的起始点,重置循环次数和总的剩余油量
         * 因为这个循环是环形的,所以要用while循环,当到达最后一个加油站,下一个要手动设置为第一个
         */
        while (n >= 0){

            if (start == gas.length){
                start = 0;
            }

            sum += gas[start] - cost[start];

            if (sum >= 0){

                start++;
                n--;
            }
            else {

                start++;
                n = gas.length;
                sum = 0;
            }
        }

        /**
         * 当完整的跑完一圈以后,start会停在起点的下一个位置
         */
        return start - 1;
    }
}

/**
 * 时间复杂度 O(n)
 * 空间复杂度 O(1)
 */

优化1——同步计算总差值

class Solution {
    public int canCompleteCircuit(int[] gas, int[] cost) {

        int start = 0;
        int sum = 0;
        int totalSum = 0;

        /**
         * 直接在循环中用totalSum统计总的油量和消耗量的差
         * 如果当前位置的油量sum小于0,就将起点设置为下一个
         * 环形数组的索引需要对长度取余
         */
        for (int i = 0; i < gas.length; i++) {

            sum += gas[i] - cost[i];
            totalSum += gas[i] - cost[i];

            if (sum < 0){

                sum = 0;
                start = (i + 1) % gas.length;
            }
        }

        /**
         * 如果totalSum小于0,肯定不能跑一圈
         */
        if (totalSum < 0){
            return -1;
        }
        
        return start;
    }
}

/**
 * 时间复杂度 O(n)
 * 空间复杂度 O(1)
 */

https://leetcode-cn.com/problems/gas-station/

posted @   振袖秋枫问红叶  阅读(30)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示