LeetCode刷题记录——day3

打印 上一主题 下一主题

主题 894|帖子 894|积分 2682

1、https://leetcode.cn/problems/gas-station/submissions/514930619/?envType=study-plan-v2&envId=top-interview-150
对于这个问题可以如许来考虑,将数据看作一个环,如果答案唯一,那么就意味着从任意一个节点开始寻找,最后都会得到同一个节点的答案,那么为何不直接从0节点开始呢?
其次,我们可以建立一个total变量来记录总的油量和消耗量的差的效果,倘若这个值小于0,则肯定没有解,倘若大于零,则说明肯定有解。
继续这个思路,当有解时,我们不妨从i节点出发,设置一个temp变量记录从i开始到j的剩余油量。当temp小于0时,说明现在到达的节点j是可以到达的,但是无法到达j+1节点,那么下次的出发点就可以从j+1开始重复这个过程。
为什么?
不妨如许考虑,i到j构成一个弧,同样,我们假设当前的问题是无解的,那么我们应该可以用上述方式将j与j+1断开,把环分成很多的弧。当然我们这里假设的无解,实在从total就可以看出。那么如果现在我们发现total大于0了,我们还可以将环分割成如许的弧吗?我们不妨0开始,一直分割,假设前面我们分割成了很多弧,最后从某个节点k开始一直遍历完了结再也没有分割出弧。那么这个末端的弧可以和第一个弧链上吗?当然可以!假设不可以的话,那么我们每个弧最终的剩余油量都不敷以支持它到达下一个弧,那么total不就是小于0了吗?但我们已经得到了total大于0,所以最后一个弧肯定可以和第一个弧连起来,接下来两个弧变成一个弧,我们将这个新弧看作最后一个弧,那么他和现在的新的第一个弧会怎么样呢,同理,他们还是可以连起来的!由此我们的算法就明确了:
[code]class Solution {public:    int canCompleteCircuit(vector& gas, vector& cost) {        int len = gas.size();        vector remaind(len);        int total = 0,temp = 0;        int start = 0;        for(int i=0;i
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

羊蹓狼

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表