每日一题-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=索引%长度

浙公网安备 33010602011771号