ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

leetcode--Gas Station问题

2020-09-24 16:00:49  阅读:219  来源: 互联网

标签:index cost -- Gas gas 加油站 Station var 总和


问题如下:

N个加油站组成一个环状头尾相接的路线,且每个下标为i的加油站总共能加gas[i]的汽油,当前加油站到下一加油站所花费的汽油为cost[i],请写出程序判断是否存在下标index使得当你从index加油站开始开车,在车的初始汽油为0的情况下按顺序走过所有其他加油站回到index加油站,如果存在输出index值,如果不存在输出-1.

解答:

大家其实很容易能想到一个O(n^2)复杂度的方法,即遍历每个加油站(数组元素),以元素i为起点,按顺序将所有元素i之后的gas和cost汇总,当循环一轮回到元素i还未出现总和<0的情况,则说明i为解,若不是则将i+1设置为新的起点,以此类推。

其实存在O(n)复杂度的方法,即遍历一次所有加油站即可。

1、显而易见,gas总和减去cost总和为正数的情况下就一定存在index解,我们的方法是基于这个命题的,我们先证明该命题是否为真,该命题逆否命题为:如果不存在解(即无解),则gas和cost的总和为负。无解可以换句话表述:不存在任何一个数i,从i开始gas[i]-cost[i]为正数,所以gas和cost总和为负数。命题得证。

2、gas总和减去cost总和为负数的情况下就不存在index解。

3、总数为正,即存在解的情况下,如果元素j到元素k总和为负,则在[j,k]范围外存在解。

程序如下:

 

/**
 * @param {number[]} gas
 * @param {number[]} cost
 * @return {number}
 */
var canCompleteCircuit = function(gas, cost) {    
    var total_gas = 0;
    var current_gas = 0;
    var index = 0;
    for(var i=0;i<gas.length;i++){
        total_gas += gas[i] - cost[i];
        current_gas += gas[i] - cost[i];
        if(current_gas < 0){
            current_gas = 0;
            index = i+1;
        }
    }
    return total_gas<0?-1:index;
};

 

标签:index,cost,--,Gas,gas,加油站,Station,var,总和
来源: https://www.cnblogs.com/imbasaber/p/13724514.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有