503.下一个更大元素 II

一、题目描述

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

示例 1:

1
2
3
4
5
输入: [1,2,1]
输出: [2,-1,2]
解释: 第一个 1 的下一个更大的数是 2;
数字 2 找不到下一个更大的数;
第二个 1 的下一个最大的数需要循环搜索,结果也是 2。

注意: 输入数组的长度不会超过 10000。

二、题解

1.算法描述

  • for循环遍历

2.个人分析

和其第一题一样,我还是没有使用stack

  1. 构造一个可以:不管从什么位置开始,都可以遍历整个数组的for循环
  2. 使用循环嵌套遍历整个数组
  3. 能找到下一个更大的数,则赋值;否则,令其值为 -1

3.代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int *nextGreaterElements(int *nums, int numsSize, int *returnSize)
{
*returnSize = 0;
if (numsSize == 0)
return NULL;
int *res = (int *)malloc(numsSize * sizeof(int));
int i, j;
for (i = 0; i < numsSize; i++)
{
for (j = (i + 1) % numsSize; j != i; j = (j + 1) % numsSize)
{
if (nums[i] < nums[j])
{
res[(*returnSize)++] = nums[j];
break;
}
}
if (res[i] != nums[j])
res[(*returnSize)++] = -1;
}
return res;
}