leetcode 134.加油站

news/2024/6/18 23:44:31 标签: leetcode, 算法, 贪心算法

本题运用暴力的形式确实是可以的,但是在于暴力的话会非常的麻烦,需要在循环中不断的判断特殊条件。

这里需要用到贪心的算法

首先我们可以想,既然我们已经知道了在当前加油站的加油量和从当前加油站到下一个加油站耗费的油量,也就是说,我们从第0个站台开始,一直往后遍历一边,计算出我们在油箱为0的情况下到底能走多少路。

如果当前你走到了第i个站台,这里如果显示你当前的油量是<0的,那么证明你并不能从第0个站台到现在这个站台,所以你只能在i+1个站台开始走,然后将这前面计算的油量清零,一直这样下去。

有两个问题:

1.如果后面还会出现负数怎么办呢?这样的话我们到底选择哪个呢?我的答案是你就选刚开始的哪个位置就行,因为我们是从局部最优推算到全局最优当中,反正我们从头到尾就推算出来了你要起始的起点至少是i+1位,这个结论是固定的。

2.如果说在我们之前抛弃的那个区间里面选择了一个起始点,到了第i个站点不会出现<0的情况怎么办呢?

这里需要着重强调一点,当我们在全局的剩余油量<0时,这可以说是无论如何你跑哪个位置都不能跑完一圈。假设在这种情况下,[0,i][i+1,n]区间的剩余油量相加一定是<0,也就是说一个区间大于零,一个区间就必须小于零。这是不可避免的。

至少是i+1个位置就是这样的。

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

暴力解法需要揭示一点,就是对于环形循环的话运用while是比较好的,这样会更方便。

下面是暴力解法,虽然不能过,但是凑活着看吧:

class Solution {
public:
    int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
        int shengyu=0;
        int index=0;
        int n=gas.size();
        for(int i=0;i<n;i++){
            shengyu=gas[i]-cost[i];
            index=(i+1)%n;
            while(shengyu>0&&index!=i){
                shengyu+=gas[index]-cost[index];
                index=(index+1)%n;
            }
            if(index==i&&shengyu>=0)
            return index;
        }
        return -1;
    }
};


http://www.niftyadmin.cn/n/5419391.html

相关文章

三步实现支付宝支付【go语言 支付宝沙箱】

支付宝沙箱支付使用背景&#xff1a; 支付宝沙箱支付是支付宝提供的一个测试环境&#xff0c;用于开发者在不影响真实交易的情况下进行支付接口的开发和调试。在沙箱环境中&#xff0c;开发者可以模拟真实的支付流程&#xff0c;包括支付、退款、查询等操作&#xff0c;以便更…

Unity性能优化篇(十二) 音频优化之导入音频后的属性设置

Unity支持后缀为.wav、.ogg、.mp3的音频文件&#xff0c;但建议使用.wav&#xff0c;因为Unity对它的支持特别好。 注意&#xff1a;Unity在构建项目时总是会自动重新压缩音频文件&#xff0c;因此无需刻意提前压缩一个音频文件再导入Unity&#xff0c;因为这样只会降低该音频文…

力扣501. 二叉搜索树中的众数

思路1&#xff1a;暴力法&#xff0c;把所有内容遍历入map中&#xff0c;然后map转list&#xff0c;按照出现的次数排序&#xff0c;for循环 获取排序值和第一个相同的数字。 思路2&#xff1a;利用二叉排序树的原理&#xff0c;中序遍历能让数组是有序的&#xff0c;左中右去…

web前端之文字逐渐展示、擦除文字效果、requestAnimationFrame

MENU 版本一(requestAnimationFrame)版本二(setTimeout)版本三(纯css) 版本一(requestAnimationFrame) 前言 window.requestAnimationFrame()告诉浏览器——你希望执行一个动画&#xff0c;并且要求浏览器在下次重绘之前调用指定的回调函数更新动画。该方法需要传入一个回调函…

【刷题】Leetcode 415 字符串相加 和 34 字符串相乘

刷题 Leetcode 415 字符串相加题目描述 思路一&#xff08;模拟大法版&#xff01;&#xff01;&#xff01;&#xff09;Leetcode 34 字符串相乘题目描述 思路一&#xff08;模拟大法版&#xff09;Thanks♪(&#xff65;ω&#xff65;)&#xff89;谢谢阅读&#xff01;&…

SpringCloudGateway理论与实践

文章目录 网关介绍为什么需要网关Gateway 使用gateway pom依赖yml 配置重启测试总结 断言过滤器工厂路由过滤器的种类请求头过滤器默认过滤器全局过滤器总结 Gateway解决跨域 网关介绍 Spring Cloud Gateway 是一个基于Spring Framework 5&#xff0c;由Spring Cloud团队开发的…

【轮式平衡机器人】——TMS320F28069片内外设之eCAP

引入 TMS320F28069的eCAP&#xff08;增强型捕获模块&#xff09;是一个强大的外设&#xff0c;用于精确测量和捕获输入信号的事件和时间戳。 在电机控制、传感器数据采集和信号处理等应用中&#xff0c;eCAP模块可以用于测量霍尔传感器、编码器或其他数字输入信号的周期、频…

elementUI日期选择器禁用功能

这次用到的是月份选择器&#xff0c;且需要对本月之前的选择都禁用掉 直接上解决方案&#xff1a; <el-date-pickerv-model"dutyMonth"type"month"label-width"300px"value-format"yyyy-MM":picker-options"pickerOptions&q…