0
点赞
收藏
分享

微信扫一扫

如何正确选择集体渲染(云渲染)和gpu离线渲染

eelq 2023-04-28 阅读 63

❓503. 下一个更大元素 II

难度:中等

给定一个循环数组 numsnums[nums.length - 1] 的下一个元素是 nums[0] ),返回 nums 中每个元素的 下一个更大元素

数字 x下一个更大的元素 是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1

示例 1:

示例 2:

提示:

  • 1 < = n u m s . l e n g t h < = 1 0 4 1 <= nums.length <= 10^4 1<=nums.length<=104
  • − 1 0 9 < = n u m s [ i ] < = 1 0 9 -10^9 <= nums[i] <= 10^9 109<=nums[i]<=109

💡思路:单调栈

和739. 每日温度解法类似,使用单调栈解决;

  • 单调栈中保存的是下标索引,从栈底到栈顶的下标在数组 nums 中对应的值是单调不升的。

  • 但不同的是该题目是循环数组,对每一个元素最多遍历一圈,即回到自己的位置。

  • 从而可以想到我们可以把这个循环数组 “拉直”, 即复制原数组所有元素拼接在原序列的后面。

  • 这样我们就可以将这个新序列当作普通序列,用上题的方法来处理。

🍁代码:(Java、C++)

Java

class Solution {
    public int[] nextGreaterElements(int[] nums) {
        int n = nums.length;
        int[] ans = new int[n];
        Arrays.fill(ans, -1);
        Stack<Integer> indexs = new Stack<>();
        for(int i = 0; i < 2 * n; i++){
            while(!indexs.isEmpty() && nums[i % n] > nums[indexs.peek()]){
                ans[indexs.pop()] = nums[i % n];
            }
            if(i < n){
                indexs.push(i);
            }
        }
        return ans;
    }
}

C++

class Solution {
public:
    vector<int> nextGreaterElements(vector<int>& nums) {
        int n = nums.size();
        vector<int> ans(n, -1);
        stack<int> indexs;
        for(int i = 0; i < 2 * n; i++){
            while(!indexs.empty() && nums[i % n] > nums[indexs.top()]){
                ans[indexs.top()] = nums[i % n];
                indexs.pop();
            }
            if(i < n){
                indexs.push(i);
            }
        }
        return ans;
    }
};

🚀 运行结果:

在这里插入图片描述

🕔 复杂度分析:

  • 时间复杂度 O ( n ) O(n) O(n),其中 n 是序列的长度。我们需要遍历该数组中每个元素最多 2 次。
  • 空间复杂度 O ( n ) O(n) O(n),其中 n 是序列的长度。空间复杂度主要取决于栈的大小,栈的大小至多为 n

题目来源:力扣。

注: 如有不足,欢迎指正!

举报

相关推荐

0 条评论