每日一题-503. 下一个更大元素 II

题目

链接

求解循环数组中元素的下一个更大元素
中等

题解

最朴素-对每个元素遍历循环数组

class Solution {
public:
    vector<int> nextGreaterElements(vector<int>& nums) {
        vector<int> NextBigger(nums.size(),-1);
        for(int i=0;i<nums.size();i++){
            
            for(int times=0,j=i+1;times<nums.size();j++,times++){
                if(j==nums.size())
                    j=0;            
                if(nums[j]>nums[i]){
                    NextBigger[i]=nums[j];
                    break;
                }
            }
            
        }
        return NextBigger;
    }
};

暴力求解的时间复杂度\(O(n^2)\),不过也能刚好AC
这是我个人的直接暴力,这里对循环数组也处理的比较笨

循环数组+单调栈

class Solution {
public:
    vector<int> nextGreaterElements(vector<int>& nums) {
        int length=nums.size();
        vector<int> NextBigger(length,-1);
        stack<int> Order;

        for(int i=0;i<2*length;i++){
            int index=i%length;

            while(!Order.empty()&&nums[Order.top()]<nums[index]){
                NextBigger[Order.top()]=nums[index];
                Order.pop();
            }

            Order.push(index);
        }

        return NextBigger;
    }
};

是暴力求解的优化。实际上对于一个递减的序列 3 2 1 ,他们的下一个更大的元素都是相同的,从优化的角度无需重复求解。
利用单调栈,栈内存储中数组nums的下标,对应的值单调不升
所以对遍历到的任意一个nums[i]:

  • 如果栈空或者小于等于栈顶,则入栈。
  • 否则nums[i]大于单调栈内所有的值,即为他们的下一个更大元素。

遍历的次数为2*nums.size()-1即可,保证最后一个元素也能完成遍历一次。
循环数组处理直接index=索引%长度

posted @ 2021-03-06 15:07  tlamm  阅读(51)  评论(0)    收藏  举报