503. 下一个更大元素 II(需要多刷)

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

示例 1:

输入: [1,2,1] 输出: [2,-1,2] 解释: 第一个 1 的下一个更大的数是 2; 数字 2 找不到下一个更大的数; 第二个
1 的下一个最大的数需要循环搜索,结果也是 2。 注意: 输入数组的长度不会超过 10000。

通过次数78,387提交次数126,048 在真实的面试中遇到过这道题?

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* nextGreaterElements(int* nums, int numsSize, int* returnSize){
*returnSize = numsSize;
 if (numsSize == 0) {
        return NULL;
    }
int * res =(int *)malloc(sizeof(int)*numsSize);
memset(res, -1, sizeof(int) * numsSize);

int stack[2*numsSize];
int top =0;
for(int i =0;i<2*numsSize-1;i++)
{
    while(top>0&&nums[i%numsSize]>nums[stack[top-1]])
    {
        res[stack[top-1]]=nums[i%numsSize];
        top--;
    }
    stack[top++]=i%numsSize;
}
return res;
}

//这道题中的单调栈是基本原理 ,但循环数组是一个难点,同时对于中间操作过程来说,top>0&&nums[i%numsSize]>nums[stack[top-1] 这个条件也是不好想的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值