• LeetCode OJ--Gas Station**


    https://oj.leetcode.com/problems/gas-station/

    啊,好笨,刚开始一直超时,复杂度为n*n。

    class Solution {
    public:
            int canCompleteCircuit(vector<int> &gas, vector<int> &cost) {
            bool may_able = false;
            for(unsigned int i = 0;i<gas.size();i++)
            {
                if(gas[i]>=cost[i])
                    may_able = true;
            }
            if(may_able == false)
                return -1;
            double amount = 0;
            //轮流做start
            for(unsigned int start = 0;start<gas.size();start++)
            {
                amount = gas[start] - cost[start];
    
                if(amount < 0)
                    continue;
                bool flag = true;
                //对每个轮流进行检查
                for(unsigned next = (start + 1)%gas.size(); next%gas.size()!=start; next = (next%gas.size()) + 1)
                {
                    amount += gas[next] - cost[next];
                    if(amount<0)
                    {
                        flag = false;
                        break;
                    }
                }
                if(flag == true)
                    return start;
            }
            return -1;
        }
    };

    之后,看了别人的答案。但是在实现的时候还是超时,发现是出现了死循环。

    如果从start开始,往后累加了几步出现了负数,则中间的这几个点,肯定也不能作为start,因为中间的步累加的结果都是正的,如果去掉了原来的start,和肯定是更小的。

    class Solution {
    public:
     
        int canCompleteCircuit(vector<int> &gas, vector<int> &cost) {
             
         
            double amount = 0;
            
            //轮流做start
            for(unsigned int start = 0;start<gas.size();start++)
            {
                amount = gas[start] - cost[start];
    
                if(amount < 0)
                    continue;
    
                //对每个轮流进行检查
                for(unsigned next = (start + 1)%gas.size(); ; next = (next+1)%gas.size())
                {
                    amount += gas[next] - cost[next];
                    if(amount<0)
                    {
                        start = ((next + 1)%gas.size()) - 1;
                        break;
                    }
                    if(next==start)
                        return start;
                }
            }
            return -1;
        }
    };

    于是,在男友的修改下:今天脑袋彻底不好使了。

    class Solution {
    public:
     
        int canCompleteCircuit(vector<int> &gas, vector<int> &cost) {
             
         
        double amount = 0;
            
            //轮流做start
            for(unsigned int start = 0;start<gas.size();start++)
            {
                amount = gas[start] - cost[start];
    
                if(amount < 0)
                    continue;
    
                //对每个轮流进行检查
                 for(unsigned next = (start + 1)%gas.size(); ; next = (next+1)%gas.size())
                {
                    amount += gas[next] - cost[next];
                    if(amount<0)
                    {
                        if(next > start)
                            start = next;
                        else
                            return -1;  //后面的点作为中间点,是已经循环过的了!!!!
                        break;
                    }
                    if(next==start)
                        return start;
                }
            }
            return -1;
        }
    };

    笨死了

  • 相关阅读:
    微信和支付宝支付模式详解及实现(.Net标准库)- OSS开源系列
    Linux+Nginx+Asp.net Core及守护进程部署
    Docker基础入门及示例
    this的指向问题
    H5C3-JS 此后面试暂不记录了 因为我发现了错题集,直接看就行了
    H5C3-JS day04
    H5C3-JS day03
    two-sum
    H5C3-JS day02
    三次握手四次挥手
  • 原文地址:https://www.cnblogs.com/qingcheng/p/3754073.html
Copyright © 2020-2023  润新知