题解 | #大胃王牛牛#

大胃王牛牛

https://www.nowcoder.com/practice/4e55777e218b4850928d054a8cddaf50

知识点

模拟,贪心

思路

假设grass和cost的长度为n 首先,我们预处理出grass和cost的差s,若s[0~n-1]<0,那必然无解,否则必然有解。

设sum为区间[ans~~n-1]的和 判断完有解后,我们只需要找到一个下标最小的点,使其一直向右遍历,维护sum=sum+s[i],若sum<0,则需要更新起点下标了。否则,若存在一个点i,使sum[i~n-1]都大于0,那ans即为i+1(下标为0的地方是第一个)

代码c++

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param grass int整型vector 
     * @param cost int整型vector 
     * @return int整型
     */
    int can_complete_circuit(vector<int>& grass, vector<int>& cost) {
        // write code here
        int sum=0;
        int s[10005];
        int n=grass.size();
        for(int i=0;i<n;i++)
        {
            s[i]=grass[i]-cost[i];
            sum+=s[i];
        }
        if(sum<0)return -1;
        int ans=0;
        sum=0;
         for(int i=0;i<n;i++)
         {  
            sum+=s[i];
            if(sum<0)
            {
                ans=i+1;
                sum=0;
            }
         }
         return ans+1;

    }
};
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务