立即上一个较大数字代码中的输出不正确

时间:2017-10-16 11:10:03

标签: c++ algorithm c++11 optimization

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

我无法在此处找出问题,请建议如何优化代码。

1 个答案:

答案 0 :(得分:1)

方法 -

  1. 使用堆栈,它将按升序跟踪以前的较大元素。
  2. 从左到右扫描,对于每个元素arr[i],一直从堆栈弹出,直到堆栈的顶部元素大于当前数字

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

    II。否则打印堆栈的顶部元素,这是前一个更大的数字。

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

  4. 代码:

    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)