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

    新手学习中,有任何错误或者更好地方法、思路欢迎指教!


     #Array 8

    题目难度:中等

    题目描述:

    在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。
    你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。
    如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1。
    
    说明: 
    如果题目有解,该答案即为唯一答案。
    输入数组均为非空数组,且长度相同。
    输入数组中的元素均为非负数。
    
    示例 1:
    输入: 
    gas  = [1,2,3,4,5]
    cost = [3,4,5,1,2]
    输出: 3
    
    解释:
    从 3 号加油站(索引为 3 处)出发,可获得 4 升汽油。此时油箱有 = 0 + 4 = 4 升汽油
    开往 4 号加油站,此时油箱有 4 - 1 + 5 = 8 升汽油
    开往 0 号加油站,此时油箱有 8 - 2 + 1 = 7 升汽油
    开往 1 号加油站,此时油箱有 7 - 3 + 2 = 6 升汽油
    开往 2 号加油站,此时油箱有 6 - 4 + 3 = 5 升汽油
    开往 3 号加油站,你需要消耗 5 升汽油,正好足够你返回到 3 号加油站。
    因此,3 可为起始索引。
    
    示例 2:
    输入: 
    gas  = [2,3,4]
    cost = [3,4,3]
    输出: -1
    
    解释:
    你不能从 0 号或 1 号加油站出发,因为没有足够的汽油可以让你行驶到下一个加油站。
    我们从 2 号加油站出发,可以获得 4 升汽油。 此时油箱有 = 0 + 4 = 4 升汽油
    开往 0 号加油站,此时油箱有 4 - 3 + 2 = 3 升汽油
    开往 1 号加油站,此时油箱有 3 - 3 + 3 = 3 升汽油
    你无法返回 2 号加油站,因为返程需要消耗 4 升汽油,但是你的油箱只有 3 升汽油。
    因此,无论怎样,你都不可能绕环路行驶一周。
    
    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/gas-station
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    1. 我的解法:

    思路:
    i遍历数组,判断是否有足够的汽油可以让你行驶到下一个加油站,有则可能从i出发。
    从i出发,获得对应汽油,j作为测试指针从i+1开始尝试遍历一圈。
      判断从j-1出发到j消耗的油量,加上到j能获得的油量能否到达j+1站,能则继续j++直到遍历一圈;否则不能从当前i出发,i++。
    231 ms,38.7 MB
    class Solution {
        public int canCompleteCircuit(int[] gas, int[] cost) {
            int n = gas.length;  //加油站个数
            int fuelTank = 0;  //油箱中的汽油量
            int j = 0;  //j从i的下一站开始
            for (int i = 0; i < n; i++){
                if (gas[i] >= cost[i]){  //有足够的汽油可以让你行驶到下一个加油站,有可能从i出发
                    //开始测试是否能走完一圈
                    fuelTank = gas[i];
                    for (j = (i+1) % n; j != i; j = (j+1) % n){
                        if (j == 0){  //避免数组溢出
                            fuelTank = fuelTank - cost[n-1] + gas[j];  //重新计算当前油量
                        } else{
                            fuelTank = fuelTank - cost[(j-1) % n] + gas[j];  //重新计算当前油量
                        }
                        if (fuelTank < cost[j]){  //判断当前油量是否不能走到下一站
                            break;
                        }
                    }
                    if (j == i){  //代表走完了一圈
                        return i;
                    }
                }
            }
            return -1;
        }
    }
  • 相关阅读:
    (BFS 二叉树) leetcode 515. Find Largest Value in Each Tree Row
    (二叉树 BFS) leetcode513. Find Bottom Left Tree Value
    (二叉树 BFS DFS) leetcode 104. Maximum Depth of Binary Tree
    (二叉树 BFS DFS) leetcode 111. Minimum Depth of Binary Tree
    (BFS) leetcode 690. Employee Importance
    (BFS/DFS) leetcode 200. Number of Islands
    (最长回文子串 线性DP) 51nod 1088 最长回文子串
    (链表 importance) leetcode 2. Add Two Numbers
    (链表 set) leetcode 817. Linked List Components
    (链表 双指针) leetcode 142. Linked List Cycle II
  • 原文地址:https://www.cnblogs.com/hi-yxiao/p/14442220.html
Copyright © 2011-2022 走看看