Que:N个数字作为输入传递给程序。该程序必须打印前一个较大的数字。如果没有针对该特定数字的较大数字打印0。
注意:由于N可以高达100000,因此请优化算法以避免超时。
输入格式:第一行包含N.第二行包含由空格分隔的N个数字。
输出格式:第一行包含N个数字,表示前一个较大的数字。
边界条件:2 <= N <= 100000
示例输入/输出1:输入:11 455 346 76 304 488 374 385 433 350 9 1000
输出:0 455 346 346 0 488 488 488 433 350 0
我的代码如下:
#include <iostream>
using namespace std;
int main(int argc, char** argv)
{
int n;
int a[100000],b[100000];
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
for(int i=1;i<n;i++)
{
if(a[i]>a[i-1])
{
b[i]=0;
}
else
{
b[i]=a[i-1];
}
}
b[0]=0;
for(int i=0;i<n;i++)
{
cout<<b[i]<<" ";
}
}
我的代码输出:0 455 346 0 0 488 0 0 433 350 0
预期:0 455 346 346 0 488 488 488 433 350 0
我无法在此处找出问题,请建议如何优化代码。
答案 0 :(得分:1)
方法 -
从左到右扫描,对于每个元素arr[i]
,一直从堆栈弹出,直到堆栈的顶部元素大于当前数字
我。如果堆栈为空,则左边没有比当前更大的数字。打印0
II。否则打印堆栈的顶部元素,这是前一个更大的数字。
将当前元素推入堆栈。
代码:
void immediatePreviousLarger(int arr[], int n) {
stack<int> Stack;
for(int i = 0; i < n; i++) {
while(!Stack.empty() and Stack.top() <= arr[i]) {
Stack.pop();
}
if(Stack.empty()) {
printf("0 ");
} else {
printf("%d ", Stack.top());
}
Stack.push(arr[i]);
}
}
时间复杂度O(n)
。