机考刷题之 9 LeetCode 503 下一个更大元素 II

题目

分析

个人认为比较巧妙的是将原数组复制两遍来模拟循环,就不用其他复杂的结构了。不过入栈时只需要前n个即可,后面n个是来给前n找是否有更大的,它们自身不需要再找更大。

代码

cpp 复制代码
class Solution {
    struct num {
        int val;
        int pos;
    };
public:
    vector<int> nextGreaterElements(vector<int>& nums) {
        int n = nums.size();
        if (n == 0) return {};

        // 构造双倍长度数组
        vector<int> myNums = nums;
        myNums.insert(myNums.end(), nums.begin(), nums.end());

        vector<int> res(n, -1);
        stack<num> myStack;

        for (int i = 0; i < 2 * n; i++) {
            int realPos = i % n;
            while (!myStack.empty() && myNums[i] > myStack.top().val) {
                res[myStack.top().pos] = myNums[i];
                myStack.pop();
            }
            // 只需要把前 n 个位置入栈(避免重复入栈)
            if (i < n) {
                myStack.push({myNums[i], realPos});
            }
        }
        return res;
    }
};

结果

相关推荐
IronMurphy1 小时前
【算法四十三】279. 完全平方数
算法
墨染天姬1 小时前
【AI】Hermes的GEPA算法
人工智能·算法
papership2 小时前
【入门级-数据结构-3、特殊树:完全二叉树的数组表示法】
数据结构·算法·链表
smj2302_796826522 小时前
解决leetcode第3911题.移除子数组元素后第k小偶数
数据结构·python·算法·leetcode
Beginner x_u2 小时前
链表专题:JS 实现原理与高频算法题总结
javascript·算法·链表
wxy不爱写代码2 小时前
C++多线程
面试·职场和发展
野生技术架构师5 小时前
金三银四面试总结篇,汇总 Java 面试突击班后的面试小册
java·面试·职场和发展
_深海凉_5 小时前
LeetCode热题100-寻找两个正序数组的中位数
算法·leetcode·职场和发展
ja哇6 小时前
大厂面试高频八股
java·面试·职场和发展
踩坑记录6 小时前
leetcode hot100 寻找两个正序数组的中位数 hard 二分查找 双指针
leetcode