Leetcode 503.下一个更大元素Ⅱ 2021.03.06

Leetcode 503.下一个更大元素Ⅱ 2021.03.06

三月 06, 2021

503.下一个更大元素Ⅱ

  • 难度:中等

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

示例

示例1:

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

说明

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

思路

  • 无赖暴破
    1. 我们遍历数组两轮
    2. 若后面有数值大于当前数值,我们就把后面的数值赋值到返回数组中
    3. 这是需要注意的是ij超出原数组的长度,所以我们需要%nums.size()处理
  • 栈+循环数组
    1. 同样的,我们需要遍历两轮
    2. 我们每到一个数值都与栈顶元素比较,若当前数值比栈顶元素所指的数值大,我们便赋值到返回数组中,并把栈顶元素pop()
    3. 并继续比较栈顶数值,直至当前值小于栈顶元素所指的数值
    4. 比较完后,我们把当前数值在数组的坐标push()栈中
    5. 最后右移,继续下一轮循环

代码实现

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
26
27
28
29
//无赖暴破
vector<int> nextGreaterElements(vector<int>& nums) {
if(nums.empty()) return {};
vector<int> res(nums.size(),-1);
for(int i = 0;i<nums.size()*2-2;i++){
for(int j = i+1;j<nums.size()*2-1;j++){
if(nums[i%nums.size()] < nums[j%nums.size()] ){
res[i%nums.size()] = nums[j%nums.size()];
break;
}
}
}
return res;
}

//栈+循环数组
vector<int> nextGreaterElements(vector<int>& nums) {
if(nums.empty()) return {};
vector<int> res(nums.size(),-1);
stack<int> s;
for(int i = 0;i<nums.size()*2-1;i++){
while(!s.empty() && nums[s.top()] < nums[i%nums.size()]){
res[s.top()] = nums[i%nums.size()];
s.pop();
}
s.push(i%nums.size());
}
return res;
}