向右看齐Look Up
发布日期:2021-05-07 07:06:15 浏览次数:15 分类:精选文章

本文共 1324 字,大约阅读时间需要 4 分钟。

为了解决这个问题,我们需要找到每只奶牛离她最近的仰望对象。每只奶牛都在向右看齐,所以我们需要判断右边的奶牛是否比她高。如果是,那么右边的奶牛就是她的仰望对象。

方法思路

为了高效地解决这个问题,我们可以使用单调栈的方法。单调栈可以帮助我们在处理每只奶牛时,快速找到右边比她高的奶牛。

具体步骤如下:

  • 初始化栈:栈将用来保存奶牛身高和索引,以便后续查找。
  • 从右到左遍历:我们从最后一只奶牛开始遍历到第一只,这样可以确保我们处理的是右边的奶牛。
  • 使用栈来记录可能的仰望对象:栈中的元素是按身高递减排列的。当处理当前奶牛时,如果栈顶的元素比当前奶牛高,则当前奶牛的仰望对象就是栈顶的奶牛。
  • 弹出栈顶元素:如果栈顶的元素不比当前奶牛高,则弹出栈顶元素,继续检查下一个元素,直到找到一个比当前奶牛高的或者栈空。
  • 记录结果:如果栈不为空,则记录栈顶的奶牛索引作为当前奶牛的仰望对象,否则记录0。
  • 解决代码

    #include 
    #include
    using namespace std;
    int main() {
    int n;
    scanf("%d", &n);
    vector
    > stack;
    vector
    ans(n + 1); // 1-based indexing
    for (int i = n; i >= 1; --i) {
    int h;
    scanf("%d", &h);
    // Pop all elements from stack that are <= current h
    while (!stack.empty() && stack.top().first <= h) {
    stack.pop();
    }
    if (!stack.empty()) {
    ans[i] = stack.top().second;
    } else {
    ans[i] = 0;
    }
    stack.push({h, i});
    }
    for (int i = 1; i <= n; ++i) {
    printf("%d\n", ans[i]);
    }
    return 0;
    }

    代码解释

  • 读取输入:首先读取奶牛的数量 n,然后读取每只奶牛的身高。
  • 初始化栈和结果数组:栈用于保存身高和索引,结果数组 ans 用于存储每只奶牛的仰望对象。
  • 从右到左遍历:遍历每只奶牛,从最后一只开始。
  • 处理当前奶牛:对于当前奶牛,检查栈顶的元素是否比它高。如果是,记录仰望对象并将当前奶牛入栈。否则,弹出栈顶元素,继续检查。
  • 输出结果:遍历结果数组,输出每只奶牛的仰望对象。
  • 这种方法确保了在处理每只奶牛时,栈的操作都是线性的,从而整体复杂度为 O(N)。

    上一篇:Dividing the Path
    下一篇:Color a Tree

    发表评论

    最新留言

    感谢大佬
    [***.8.128.20]2025年04月09日 13时09分22秒