LeetCode 503-Next Greater Element II(单调栈,下一个最大/小元素)

LeetCode 503 Next Greater Element II

题干:

给定一个环形数组 n u m s nums nums n u m s [ n u m s . l e n g t h − 1 ] nums[nums.length-1] nums[nums.length1]就是 n u m s [ 0 ] nums[0] nums[0]),对于其中每一个元素,求它之后比它大的第一个元素是多少。

Input: nums = [2,1,2,4,3]
Output: [4,2,4,-1,4]

解:

还是求下一个更大元素,不同的是数组是环形。

环形数组,常用套路是把数组长度翻倍,把原数组往后复制一份。但其实可以不用额外创建空间,只是把遍历的下标 i i i翻倍了,利用取模运算( i % n i \% n i%n)就可完成循环遍历。

vector<int> nextGreaterElements(vector<int>& nums) {
        int n = nums.size();
        stack<int> st;
        vector<int> ans(n); //给vector初始化,以便可以直接通过下标访问 
        for(int i = 2*n - 1; i >= 0; i--){
            while(!st.empty() && st.top() <= nums[i%n]){
                st.pop();
            }
            ans[i%n] = st.empty()? -1: st.top();//ans[i%n]覆盖更新,刷新了一遍,保证最后一次是准确答案
            st.push(nums[i%n]);
        }
        return ans;
    }

Tips:

  • 循环遍历数组:取模( i % n i \% n i%n

  • vector不能用下标形式添加元素,但是可以用下标形式对元素内容进行修改,即下标 v [ n ] v[n] v[n]是返回 v v v中第 n n n个位置元素的引用。

    vector<int> v;
    v[0]=1; //错误,因为v不包含任何元素
    vector<int> v2(10);
    v2[0]=1; //正确,此时v2是含有10个0的容器
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值