zoukankan      html  css  js  c++  java
  • LeetCode——加油站

    Q:环形路上有n个加油站,第i个加油站的汽油量是gas[i].
    你有一辆车,车的油箱可以无限装汽油。从加油站i走到下一个加油站(i+1)花费的油量是cost[i],你从一个加油站出发,刚开始的时候油箱里面没有汽油。
    求从哪个加油站出发可以在环形路上走一圈。返回加油站的下标,如果没有答案的话返回-1。
    注意:
    答案保证唯一。
    A:
    假设从站点 i 出发,到达站点 k 之前,依然能保证油箱里油没见底儿,从k 出发后,见底儿了。那么就说明 diff[i] + diff[i+1] + ... + diff[k] < 0,而除掉diff[k]以外,从diff[i]开始的累加都是 >= 0的。也就是说diff[i] 也是 >= 0的,这个时候我们还有必要从站点 i + 1 尝试吗?仔细一想就知道:车要是从站点 i+1出发,到达站点k后,甚至还没到站点k,油箱就见底儿了,因为少加了站点 i 的油.

        public static int canCompleteCircuit(int[] gas, int[] cost) {
            if (gas.length == 0 || cost.length == 0)
                return -1;
            int j;
            int start = -1;
    
            for (int i = gas.length - 1; i >= 0; i--) {
                int remain = 0;
                j = i;
                while (true) {
                    remain += (gas[j] - cost[j]);
                    if (remain < 0)
                        break;
                    if (j == i - 1 || (i == 0 && j == gas.length - 1)) {
                        start = i;
                        break;
                    }
                    j++;
                    if (j >= gas.length)
                        j = 0;
                }
                if (start != -1)
                    break;
            }
            return start;
        }
    
  • 相关阅读:
    [原创]用C++类实现单向链表的增删查和反转操作
    [原创]c语言中const与指针的用法
    [原创]大连sap vt 实习生面试经历
    Android studio 相关错误处理
    Java 判断整数方法
    Android 网络编程
    Android 基础篇(二)
    Android ListView 的基本应用,包括缓存
    Java重点识记
    Android基础篇(一)
  • 原文地址:https://www.cnblogs.com/xym4869/p/12463310.html
Copyright © 2011-2022 走看看