题解44 |N数排序出栈前,一组一栈思华年 #栈和排序#

栈和排序

https://www.nowcoder.com/practice/95cb356556cf430f912e7bdf1bc2ec8f

#include <algorithm>
#include <climits>
#include <stack>
#include <vector>

class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 栈排序
     * @param a int整型vector 描述入栈顺序
     * @return int整型vector
     */
    vector<int> solve(vector<int>& a) {
        // write code here
        stack<int> s;
        //最后返回答案数组
        vector<int> ans;

        //bmax[i]数组记录的就是a数组第i位后面所剩余元素的最大值
        vector<int> bmax(a.size());

        bmax[a.size() - 1] = INT_MIN;//先让bmax数组的最后一个元素的值为无穷小
        //再从bamx数组倒数第二位开始填写
        for (int i = a.size() - 2; i >= 0; i--) {
            //倒序将bmax数组和a数组从最后一位开始进行逐位比较
            bmax[i] = max(a[i + 1], bmax[i + 1]); 
        }

        for (int i = 0; i < a.size(); i++) {
            //如果即将入栈的元素比后面还没入栈的元素中的最大值还要大,就说明这个元素是最大的
            if (a[i] > bmax[i]) {
                ans.push_back(a[i]);
                int last_max = bmax[i];//更新lastmax(用来记录后面还没入站的元素中的最大值)
                while (!s.empty() && s.top() > last_max) {
                    ans.push_back(s.top());
                    s.pop();
                }
            }
            //如果即将入栈的a数组的这个元素比后面剩余要入栈的元素中的最大值要小,直接入栈 
            else {
                s.push(a[i]);
            }
        }
        while (!s.empty()) {
            ans.push_back(s.top());
            s.pop();
        }

        return ans;
    }
};

基本算法思想:

1. 创建一个栈s和一个空的结果数组ans。

2. 创建一个辅助数组bmax,用来记录a数组的第i位后所剩余元素的最大值。

3. 初始化bmax的最后一个元素为INT_MIN(无穷小)。

4. 从倒数第二位开始遍历a数组,将bmax数组的每个元素设置为a数组从当前位置到末尾的最大值。

5. 遍历a数组,对于每个元素:

- 如果当前元素比后面还没入栈的元素中的最大值还要大,说明这个元素是最大的,将它加入ans数组。

同时,将栈中大于当前元素的元素都弹出,并加入ans数组。

- 如果当前元素比后面剩余要入栈的元素中的最大值要小,直接将它入栈。

6. 将栈中剩余的元素依次弹出,并加入ans数组。

7. 返回ans数组作为结果。

时间复杂度:

O(n),其中n是a数组的长度。需要遍历a数组两次,分别是初始化bmax数组和遍历a数组。

空间复杂度:

O(n),需要使用一个辅助数组bmax和一个栈s来辅助计算。

2024考研数据结构 文章被收录于专栏

本人考研刷算法题,立此专栏练习强化。

全部评论

相关推荐

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