重温算法之加油站

简介: 有时候自己一直找不到突破口是因为自己把问题想困难了,其实有的问题很简单,需要不断的分解。无论怎么样,这也是自己思考后的产物

微信截图_20220531173728.png


一.题目介绍


1.题目来源


链接:LeetCode


2.题目


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

微信截图_20220531174323.png


二.具体实现


1.实现思路


考虑暴力破解,一方面是验证下自己对题目的理解是否正确,另一方面后续的优化也可以从这里入手。
考虑从第 0 个点出发,能否回到第 0 个点。
考虑从第 1 个点出发,能否回到第 1 个点。
考虑从第 2 个点出发,能否回到第 2 个点。
......
考虑从第 n 个点出发,能否回到第 n 个点。
由于是个圆,得到下一个点的时候我们需要取余数。
另外针对暴力法,优化算法主要从圆上入手
复制代码


2.实现代码


1)暴力法,缺点很明显,每一步都需要避开圆


public int canCompleteCircuit(int[] gas, int[] cost) {
    //汽油
    int n = gas.length;
    //考虑从每个点出发
    for (int i = 0; i < n; i++) {
        int j = i;
        int remain = gas[i];
        //说明可以到达下一个点
        while (remain -cost[j] >=0){
            //减去花费的 + 新的补给的
            remain = remain - cost[j] + gas[(j+1) % n];
            j = (j + 1) % n;
            //j 回到了 i
            if (j == i) {
                return i;
            }
        }
    }
    return -1;
}
复制代码


2)针对暴力法的优化算法


public int canCompleteCircuit1(int[] gas, int[] cost) {
    int n = gas.length;
    for (int i = 0; i < n; i++) {
        int j = i;
        int remain = gas[i];
        while (remain - cost[j] >= 0) {
            //减去花费的加上新的点的补给
            remain = remain - cost[j] + gas[(j + 1) % n];
            j = (j + 1) % n;
            //j 回到了 i
            if (j == i) {
                return i;
            }
        }
        if (j < i) {
            return -1;
        }
        //i 直接跳到 j,外层 for 循环执行 i++,相当于从 j + 1 开始考虑
        i = j;
    }
    return -1;
}
复制代码


3.运行结果


微信截图_20220531174359.png

微信截图_20220531174422.png


三.题后思考


可以看出来,即使是优化后的算法,其实也不是最优解。有时候自己一直找不到突破口是因为自己把问题想困难了,其实有的问题很简单,需要不断的分解。无论怎么样,这也是自己思考后的产物,算法题,每做一题再去看题友的解决方案都有所收获,哦,原来这个题还能这么做,也算是每天进步一点点吧,加油!

目录
相关文章
|
6月前
|
算法 vr&ar 图形学
☆打卡算法☆LeetCode 134. 加油站 算法解析
☆打卡算法☆LeetCode 134. 加油站 算法解析
|
算法 网络架构
代码随想录算法训练营第三十三天 | LeetCode 1005. K 次取反后最大化的数组和、134. 加油站、135. 分发糖果
代码随想录算法训练营第三十三天 | LeetCode 1005. K 次取反后最大化的数组和、134. 加油站、135. 分发糖果
55 0
算法训练Day34|1005.K次取反后最大化的数组和 ● 134. 加油站● 135. 分发糖果
算法训练Day34|1005.K次取反后最大化的数组和 ● 134. 加油站● 135. 分发糖果
|
存储 算法 前端开发
前端算法-加油站
前端算法-加油站
|
算法
重温算法之排序链表
这个题目有点麻烦,如果是使用的暴力法,会直接超时,使用自顶向下的归并排序的话,其实也没有多大的提升,目前是没有好的解决方案的,后期继续思考吧。
131 0
重温算法之排序链表
|
算法 测试技术
重温算法之括号生成
对于需要一直寻找到最终结果或者条件的题目,一般使用回溯算法,还有就是不要忽略题目的隐藏的一些点,如果忽略,可能某个测试用例就会报错,同时也要做判空处理。
97 0
重温算法之括号生成
|
算法
重温算法之有效的括号
这个题为什么借助栈会变得很容易呢,因为都是在利用栈先进先出的特点,然后匹配左右括号,如果只有其中之一则不满足,不满足的从栈里取出,剩下的就是满足条件的。
111 0
重温算法之有效的括号
|
算法
重温算法之单词搜索
对于回溯算法大家都不陌生,为此还有题友写成了回溯算法的模板,只要按模板套题都能灵活解题,算是开辟了一种做题的方式吧,有的算法题还是很磨人的。
138 0
重温算法之单词搜索
|
算法
重温算法之删除有序数组中的重复项
其实这个题用题友的双指针解法比较简洁而且效率更高,针对数据是有序,而且相同元素最多保留N位的问题可以使用此方案解题。
161 0
重温算法之删除有序数组中的重复项
|
算法
重温算法之颜色分类
可以看到题目已经有限制使用现有函数sort了,也就是很多时候我们在解题的时候会使用到现有的函数,算是偷懒了,这也是一个提醒,做题的时候一定要把题目审清楚,不然写完了才发现不对。
149 0
重温算法之颜色分类