134.加油站(力扣)

文章讨论了解决LeetCode中一道关于路径选择的问题,要求在给定的gas和cost数组中找到一个起点,使得累加和始终大于0。提供了两种方法:一是寻找何时cursum变为负值的起点重置,二是找到累加和最小时的下一个起点。
摘要由CSDN通过智能技术生成

. - 力扣(LeetCode)

感觉这道题目,在中等题里面算挺难的

分析:

gas = [1,2,3,4,5], cost = [3,4,5,1,2]

 其实就是保证过程中累加sum=gas-cost,恒大于0

如果最后sum>=0,说明走的通

然后判断起点,有两种方法

1.

设置cursum,当cursum<0的时候,将i+1作为新的起点,然后cursum=0

理解,每次cursum<0的时候,说明前面的路其实不适合走,/不适合做起点,因为到i这里已经输了

只能从后面另寻起点(胜利)

class Solution {
public:
    int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
    int sum=0;
    int cursum=0;
    int start=0;
    for(int i=0;i<gas.size();i++){
        sum+=gas[i]-cost[i];
        cursum+=gas[i]-cost[i];
        if(cursum<0){
            start=i+1;
            cursum=0;
        }
    }
    if(sum<0)return -1;
    else return start;
    }
};

2.

设置minn,寻找什么时候sum最小的时候,更新minn=sum,minn_index=i,然后返回minn_index+1

理解:类似第一问,都是在寻找全盘皆输的时候,但是这个是寻找输的最彻底的,然后输的最彻底的下一个位置作为重新出发点!!!(简单吧?)哈哈哈

然后,为什么minn_sum最小的是就是输的最彻底呢?因为一直在比较,只要后面没小于前面的,前面的一定是最小的时候

需要注意,当minn>=0说明,这局没有输的地方(也就是第一步就赢了)
    int sum=0;
    int minn_index=0;
    int minn=999999;
    for(int i=0;i<gas.size();i++){
        sum+=gas[i]-cost[i];
        if(sum<minn){
            minn_index=i;
            minn=sum;
        }
    }
    if(sum<0)cout<<-1;
    else if(minn>=0)return 0;
    else cout<<(minn_index+1)%gas.size();

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值