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

Incorrect output in Immediate Previous Larger Number code

本文关键字:输出 不正确 代码 数字 上一个      更新时间:2023-10-16

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. 使用堆栈,该堆栈将按升序跟踪先前较大的元素。
  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) .