【题解】 栈和排序(栈 + 预处理 / 贪心)

https://www.nowcoder.com/practice/95cb356556cf430f912e7bdf1bc2ec8f?tpId=196&tqId=37173&ru=/exam/oj
在这里插入图片描述

  1. 预处理最大值
#include <climits> // 包含标准整数类型的定义
#include <vector>  // 包含标准vector容器的定义

class Solution {
  public:
    /**
    * 栈排序算法实现
    * @param a int整型vector 描述入栈顺序
    * @return int整型vector 排序后的栈
    */
    vector<int> solve(vector<int>& a) {
        // 定义栈和右端点的最大值数组
        int n = a.size(); // 栈的大小
        stack<int> st;    // 定义一个整型栈
        vector<int> right(n, 0); // 初始化右端点数组,所有元素初始为0
        right[n - 1] = INT_MIN; // 将最后一个元素设置为最小整数值,作为初始值
        // 计算每个位置的右端点最大值
        for (int i = n - 2; i >= 0; --i) {
            right[i] = max(right[i + 1], a[i + 1]);
        }

        vector<int> ret; // 定义返回结果的vector
        // 遍历入栈序列,按照规则排序
        for (int i = 0; i < n; ++i) {
            if (a[i] > right[i]) { // 如果当前元素大于其右端点的最大值
                ret.push_back(a[i]); // 将当前元素加入返回结果
                int lastMax = right[i]; // 记录当前元素作为下一个比较的基准
                // 弹出所有比基准值大的栈顶元素
                while (!st.empty() && st.top() > lastMax) {
                    ret.push_back(st.top()); // 弹出并加入返回结果
                    st.pop(); // 弹出栈顶元素
                }
            } else {
                st.push(a[i]); // 如果当前元素小于或等于其右端点的最大值,则压入栈中
            }
        }
        // 弹出栈中剩余的所有元素
        while (!st.empty()) {
            ret.push_back(st.top());
            st.pop();
        }

        return ret; // 返回排序后的栈
    }
};
  1. 贪心
class Solution {
public:
    /**
     * 栈排序算法实现
     * @param a int整型vector 描述入栈顺序
     * @ @return int整型vector 排序后的栈
     */
    vector<int> solve(vector<int>& a) {
        // 定义栈和哈希表,哈希表用于记录元素是否已经入栈
        int n = a.size();
        stack<int> st;
        bool hash[50010] = {0}; // 假设元素的值不会超过50000,初始化哈希表
        int aim = n; // aim用于记录当前需要出栈的元素的索引
        vector<int> ret; // 定义返回结果的vector

        // 遍历输入的栈序列
        for (auto x : a) {
            st.push(x); // 将元素压入栈中
            hash[x] = true; // 记录该元素已经入栈

            // 更新aim值,即找到下一个未入栈的元素的索引
            while (hash[aim]) {
                aim--; // 如果当前aim位置的元素已经入栈,则aim减1
            }

            // 出栈操作
            while (st.size() && st.top() >= aim) {
                ret.push_back(st.top()); // 弹出栈顶元素,并加入结果vector
                st.pop(); // 弹出栈顶元素
            }
        }

        return ret; // 返回排序后的栈序列
    }
};

相关推荐

  1. 「数据结构」题解

    2024-07-14 23:18:05       50 阅读
  2. leetcode 队列相关题目

    2024-07-14 23:18:05       53 阅读
  3. Python题解Leetcode Hot 100之

    2024-07-14 23:18:05       24 阅读
  4. 数据结构——排序

    2024-07-14 23:18:05       70 阅读
  5. 【leetcode】题目总结

    2024-07-14 23:18:05       30 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-14 23:18:05       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-14 23:18:05       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-14 23:18:05       57 阅读
  4. Python语言-面向对象

    2024-07-14 23:18:05       68 阅读

热门阅读

  1. Mybatis一对一,一对多关联查询

    2024-07-14 23:18:05       24 阅读
  2. R语言简单介绍及零基础学习路径

    2024-07-14 23:18:05       19 阅读
  3. 在unity中的球形插值方法中第三个参数t是什么

    2024-07-14 23:18:05       17 阅读
  4. linux安装pure-ftpd-1.0.51

    2024-07-14 23:18:05       17 阅读
  5. Linux 编程中的 open() 与 fdopen() 区别与联系

    2024-07-14 23:18:05       19 阅读
  6. iPython 使用技巧

    2024-07-14 23:18:05       16 阅读
  7. C基础入门题:石头剪刀布

    2024-07-14 23:18:05       21 阅读
  8. Linux C++编程-实现进程的冻结与恢复管理模块

    2024-07-14 23:18:05       17 阅读