题解 | #牛群放牧顺序# bfs 求最长上升路径

牛群放牧顺序

https://www.nowcoder.com/practice/69f5f2d04d1c41df8d4e0691f6ef6935

知识点

bfs

思路

每个点的应该放牧的值实际上是左右两侧最长上升路径的节点个数。可以找出最低的点,做多源bfs从而找到每个点的最长上升路径,这一步可以用bfs或者dijkstra算法。因为每个点在左右两侧的大小关系是固定的,每个点最多入堆常数次,时间复杂度为O(n)

AC Code (C++)

#include <numeric>
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param ratings int整型vector 
     * @return int整型
     */
    int min_pasture_time(vector<int>& ratings) {
        int n = ratings.size();
        if (n == 1) return 1;
        // bfs
        vector<int> res(n, 0);
        queue<int> q;
        for (int i = 0; i < n; i ++) {
            if (i == 0) {
                if (ratings[i] <= ratings[i + 1]) {
                    res[i] = 1;
                    q.push(i);
                }
            }
            else if (i == n - 1) {
                if (ratings[i] <= ratings[i - 1]) {
                    res[i] = 1;
                    q.push(i);
                }
            }
            else if (ratings[i] <= ratings[i - 1] and ratings[i] <= ratings[i + 1]) {
                res[i] = 1;
                q.push(i);
            }
        }

        while (q.size()) {
            auto t = q.front();
            q.pop();
            if (t - 1 >= 0 and ratings[t - 1] > ratings[t] and res[t - 1] < res[t] + 1) {
                res[t - 1] = res[t] + 1;
                q.push(t - 1);
            }
            if (t + 1 < n and ratings[t + 1] > ratings[t] and res[t + 1] < res[t] + 1) {
                res[t + 1] = res[t] + 1;
                q.push(t + 1);
            }
        }

        return accumulate(res.begin(), res.end(), 0);
    }
};

全部评论

相关推荐

不愿透露姓名的神秘牛友
06-25 19:15
点赞 评论 收藏
分享
qq乃乃好喝到咩噗茶:院校后面加上211标签,放大加粗,招呼语也写上211
点赞 评论 收藏
分享
头顶尖尖的程序员:我也是面了三四次才放平心态的。准备好自我介绍,不一定要背熟,可以记事本写下来读。全程控制语速,所有问题都先思考几秒,不要急着答,不要打断面试官说话。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务