<leetcode> Gas station

There are N gas stations along a circular route, where the amount of gas at station i is gas[i].

You have a car with an unlimited gas tank and it costs cost[i] of gas to travel from station i to its next station (i+1). You begin the journey with an empty tank at one of the gas stations.

Return the starting gas station's index if you can travel around the circuit once, otherwise return -1.

Note:

The solution is guaranteed to be unique.


思路来源于水中的鱼

新建一个油耗数组diff[], 赋值为diff[i]=gas[i]-cost[i] 若存在解,则证明diff[]的和为正值(总补给大于总消耗),若diff[]和为负值,证明无解(消耗大于补给)

设解为k(唯一),则diff[]中从k到diff.length-1的和为正值(可以从k走到最后), 并且对于其中任意一个点n,k到n的和均为正值(否则k无法到n)

设一个sum=sum+diff[i],当sum小于0的时候从当前位置从新开始计算(sum=0,start=i+1)直到找到一个k使k到(diff.size-1)的和为正值。如果没有返回-1;

找到k后同时需要确定是否有解(即k能否从length-1走到k(loop)),若diff[]和为正则证明有解,k为唯一解,若为负证明无解返回-1


public class Solution {
    public int canCompleteCircuit(int[] gas, int[] cost) {
        int[] diff=new int[gas.length];
        for(int i=0;i<gas.length;i++){
            diff[i]=gas[i]-cost[i];
        }
        int leftGas=0;
        int sum=0;
        int start=0;
        for(int i=0;i<gas.length;i++){
            leftGas+=diff[i];
            sum+=diff[i];
            if(sum<0){
                sum=0;
                start=i+1;
            }
        }
        if(start>=gas.length){
            return -1;
        }
        else if(leftGas<0){
            return -1;
        }
        else return start;
    }
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用以下方法对二维向量vector<vector<int>>进行排序: 1. 使用STL中的sort函数进行排序。引用中提到了一些排序算法,比如堆排序(heap_sort),希尔排序(shell_sort),选择排序(select_sort)和快速排序(quick_sort_swap)。你可以根据需要选择其中一个算法对vector<vector<int>>进行排序。 2. 如果你想在创建二维向量时就进行排序,你可以使用引用中的方法通过vector创建二维数组,并在创建时对其中的元素进行排序。 3. 如果你已经创建了一个二维向量,你可以使用引用中的方法使用resize函数对二维向量进行重新分配,并在重新分配时对其中的元素进行排序。 无论你选择哪种方法,都可以对二维向量vector<vector<int>>进行排序。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [vector<string>和vector<int>](https://blog.csdn.net/toCVer/article/details/122484732)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [leetcode2sumc-Code-Storm2019:力密码2019](https://download.csdn.net/download/weixin_38700430/19937142)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值