首页 > 其他分享 >LeetCode/加油站

LeetCode/加油站

时间:2022-09-03 15:57:07浏览次数:43  
标签:vector int gas 加油站 remain cost LeetCode

在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。
你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。
给定两个整数数组 gas 和 cost ,如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1

1. 暴力遍历每个初始位置

class Solution {
public:
    int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
        int n =gas.size();
        for(int i=0;i<gas.size();i++){
            int j = i;//j为这一轮初始位置
            int remain = gas[j];
            while(remain-cost[j]>=0){
                remain = remain - cost[j] + gas[(j+1)%n];
                j = (j+1)%n;//移动到下一位置
                if(j==i) return j;//回到初始位置
            }
        }
        return -1;
    }
};

2. 贪心从上一轮位置开始

class Solution {
public:
    int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
        int n =gas.size();
        for(int i=0;i<gas.size();i++){
            int j = i;//j为这一轮初始位置
            int remain = gas[j];
            while(remain-cost[j]>=0){
                remain = remain - cost[j] + gas[(j+1)%n];
                j = (j+1)%n;//移动到下一位置
                if(j==i) return j;//回到初始位置
            }
            if(j<i) return -1;//回到了前面遍历的位置,而没有一口气遍历完
            i = j;//直接让下一轮以上一轮的下一位置为起点
        }
        return -1;
    }
};

3. 贪心选择最大代价的下一位置

class Solution {
public:
    int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
        int n =gas.size();
        int remain = 0;
        int minremain = INT_MAX; int minindex = -1;
        for(int i=0;i<n;i++){
            remain = remain +gas[i] - cost[i];
            if(remain<minremain){
                minremain = remain;
                minindex = i;
            }
        }
        return remain<0?-1:(minindex+1)%n;
    }
};

标签:vector,int,gas,加油站,remain,cost,LeetCode
From: https://www.cnblogs.com/929code/p/16652802.html

相关文章

  • leetcode202-快乐数
    https://leetcode.cn/problems/happy-number/一开始的错误代码int sum;        if(n==1)    return true;        while(n>9)       ......
  • [Google] LeetCode 562 Longest Line of Consecutive One in Matrix
    Givenanmxnbinarymatrixmat,returnthelengthofthelongestlineofconsecutiveoneinthematrix.Thelinecouldbehorizontal,vertical,diagonal,or......
  • LeetCode/递增的三元子序列
    给你一个整数数组nums,判断这个数组中是否存在长度为3的递增子序列1.贪心法贪心更新两个最左端端点classSolution{public:boolincreasingTriplet(vector<int>......
  • [Leetcode 189]轮转数组
    Leetocde189轮转数组这题能被用做mid题是因为一题多解,其中基于双指针的轮状数组解法是比较难的1.使用新数组__直接把第i个元素移到第(i+k)%numsize位置,类似循环队列voi......
  • LeetCode617 合并二叉树
    LeetCode617合并二叉树#Definitionforabinarytreenode.#classTreeNode:#def__init__(self,val=0,left=None,right=None):#self.val=val......
  • [Google] LeetCode 778 Swim in Rising Water 优先队列
    Youaregivenannxnintegermatrixgridwhereeachvaluegrid[i][j]representstheelevationatthatpoint(i,j).Therainstartstofall.Attimet,thed......
  • leetcode1502-判断能否形成等差数列
      我的原始代码class Solution {public:    bool canMakeArithmeticProgression(vector<int>& arr) {        sort(arr.begin(),arr.end()); ......
  • leetcode191-位1的个数
    1.循环检查二进制位把题目给出的数不断对2取余,余数为1则计数class Solution {public:    int hammingWeight(uint32_t n) {        int count=0;......
  • leetcode976-三角形的最大周长
    第一反应是排序,然后瞎想了很多什么双指针、三指针的东西。看了评论区才豁然开朗。“为什么排序遍历相邻元素可行,有没有可能最优解为非相邻元素?(不会)证明:反证假设a,b,......
  • LeetCode 51 n皇后
    constintN=20;classSolution{public:vector<vector<string>>res;boolcol[N],dg[N],udg[N];voiddfs(intu,intn,vector<string>&pa......