链接:https://www.nowcoder.com/questionTerminal/2a2c00e7a88a498693568cef63a4b7bb
来源:牛客网
给定一个可能含有重复值的数组 arr,找到每一个 i 位置左边和右边离 i 位置最近且值比 arr[i] 小的位置。返回所有位置相应的信息。
输入描述:
第一行输入一个数字 n,表示数组 arr 的长度。 以下一行输入 n 个数字,表示数组的值
输出描述:
输出n行,每行两个数字 L 和 R,如果不存在,则值为 -1,下标从 0 开始。
思路:
采用单调栈
单调栈:栈内的元素都保持单调递增或者单调递减的栈。
核心代码:
stack<int> s;
for(int i=0;i<n;i++){
while(!s.empty()&&arr[s.top()]>=arr[i])
s.pop();
//TODO
if(s.empty())
......
else
...........
//TODO
s.push(i);
}
实现:
#include<iostream>
#include<vector>
#include<stack>
#include<cassert>
using namespace std;
void printV(vector<vector<int>>& m);
int main(){
int n,value;
vector<int> arr;
stack<int> s;
cin>>n;
assert(1<=n&&n<=1000000);
for(int i=0;i<n;i++){
cin>>value;
assert(-1000000<=value&&value<=1000000);
arr.push_back(value);
}
vector<int> tem={0,0};
vector<vector<int>> res(n,tem);
for(int i=0;i<n;i++){
while(!s.empty()&&arr[s.top()]>=arr[i]) s.pop();
res[i][0]=s.empty()?-1:s.top();
s.push(i);
}
while(!s.empty()) s.pop();
for(int i=n-1;i>=0;i--){
while(!s.empty()&&arr[s.top()]>=arr[i]) s.pop();
res[i][1]=s.empty()?-1:s.top();
s.push(i);
}
printV(res);
return 0;
}
void printV(vector<vector<int>>& m){
int rowNum = m.size();
int colNum = m[0].size();
for(int i=0;i<rowNum;i++){
for(int j=0;j<colNum;j++)
cout<<m[i][j]<<" ";
cout<<endl;
}
}
运行结果:
您的代码已保存
运行超时:您的程序未能在规定时间内运行结束,请检查是否循环有错或算法复杂度过大。
case通过率为85.00%
暂时没找到合适的解决方法,现在放在这仅供大家交流。