立即输出错误以前较大的数字代码

问题描述:

阙: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

我这里无法弄清楚这个问题,请建议如何优化代码。

+1

我建议你花些时间阅读Eric Lippert的[如何调试小程序](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。 –

+0

我不明白你的问题(你试图解决的任务)。这是不够清楚... –

+0

请[编辑]你的问题,告诉我们你做了什么样的调试。我希望你已经在Valgrind或类似的检查器中运行了你的[mcve],并且用例如GDB等调试器进行了调查。确保你也启用了一整套编译器警告。这些工具告诉你什么,他们缺少什么信息?并阅读Eric Lippert的[如何调试小程序](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。 –

的方法 -

  1. 使用栈将跟踪升序以前更大的元素。
  2. 不要从左到右扫描和每一个元素arr[i],保持从堆栈弹出,直到堆栈的顶部元素大于当前数量

    我。如果堆栈为空,则没有比当前更多的数字。打印0

    ii。否则打印堆栈的最上面的元素,它是前一个更大的数字。

  3. 将当前元素推入堆栈。

代码:

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)

+0

“使用堆栈”nope,完全不需要。 –

+0

我没有提到任何地方堆栈是强制性的。这是让他的解决方案获得*接受*并避免*超过时限的方法之一。 –

+0

哎呀抱歉,显然我误解了问题陈述。 –