IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> leetcode 134 加油站 -> 正文阅读

[数据结构与算法]leetcode 134 加油站

前言

题目:134. 加油站

参考题解:加油站-代码随想录


提交代码

方法一:暴力法。均从0位置开始进行累计比较。比较简单,代码略。

方法二:从汽油量最大的点,进行累计比较。最大点失败,则从次大点开始。依次类推,直到确定当前条件无法绕圈。

方法三:这个方法不错,但不容易想到。

  • 每个加油站的剩余量rest[i]为gas[i] - cost[i]。

  • i从0开始累加rest[i],和记为curSum,一旦curSum小于零,说明[0, i]区间都不能作为起始位置,起始位置从i+1算起,再从0计算curSum。

我推荐方法一,虽然它是暴力法,但它足够简单,在数据量较少时,完全可以承受。

方法二:从油量较大的站点出发

#include <vector>
#include <algorithm>
#include <map>
#include <iostream>

using namespace std;

class Solution {
public:
    int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
        multimap<int,int> gas_i; // <汽油量,下标>
        for(int i=0; i<gas.size(); i++){
            gas_i.insert(make_pair(gas[i],i));
        }

        multimap<int,int>::iterator it;
        for(it=gas_i.begin(); it!=gas_i.end(); it++){ // 从大于始发站需要汽油量,从大到小选择
            int gas_count = 0;
            int cost_count = 0;
            int loc = it->second;
            int i;
            for(i=0; i<gas.size(); i++){
                gas_count += gas[loc];
                cost_count += cost[loc];
                if(gas_count < cost_count)
                    break;
                loc = (loc+1)%gas.size();
            }
            if(i==gas.size()) break;
        }

        return it==gas_i.end() ? -1 : it->second;
    }
};

int main(void){
    vector<int> gas  = {2,0,1,2,3,4,0};
    vector<int> cost = {0,1,0,0,0,0,11};
    Solution s;
    cout<<s.canCompleteCircuit(gas,cost);
}

方法三:贪心

思路和代码实现,来自参考题解。

class Solution {
public:
    int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
        int curSum = 0;
        int totalSum = 0;
        int start = 0;
        for (int i = 0; i < gas.size(); i++) {
            curSum += gas[i] - cost[i];
            totalSum += gas[i] - cost[i];
            if (curSum < 0) {   // 当前累加rest[i]和 curSum一旦小于0
                start = i + 1;  // 起始位置更新为i+1
                curSum = 0;     // curSum从0开始
            }
        }
        if (totalSum < 0) return -1; // 说明怎么走都不可能跑一圈了
        return start; // 当可以走一圈时候,起点必然是圈中某一点。从[start,end]多出来的油量,可以填补[0.start-1]。很巧妙~
    }
};

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-10-07 14:04:31  更:2021-10-07 14:06:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/17 11:50:10-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码