【发布时间】:2022-01-23 04:54:26
【问题描述】:
我遇到了一些未知测试用例的分段错误,我无法解决它。 它适用于大多数情况。我只想知道在哪种情况下我会遇到分段错误。 该代码是为直方图中的问题 Maximim Rectangular Area 编写的。你可以在这里查看这个问题:https://practice.geeksforgeeks.org/problems/maximum-rectangular-area-in-a-histogram-1587115620/1#
下面是代码:
long long getMaxArea(long long arr[], int n)
{
int nsl[n];
int nsr[n];
stack<int>s;
// nsl
for(int i=0;i<n;i++)
{
if(i==0)
{
nsl[i]=-1;
s.push(i);
}
else{
while(!s.empty())
{
if(arr[s.top()]<arr[i])
break;
s.pop();
}
if(s.empty())
nsl[i]=-1;
else
nsl[i]=s.top();
s.push(i);
}
}
stack<int>st;
// nsr
for(int i=n-1;i>=0;i--)
{
if(i==n-1)
{
nsr[i]=n;
st.push(i);
}
else{
while(!st.empty())
{
if(arr[st.top()]<arr[i])
break;
st.pop();
}
if(st.empty())
nsr[i]=n;
else
nsr[i]=st.top();
st.push(i);
}
}
long long ans=0;
for(int i=0;i<n;i++)
ans=max(ans,arr[i]*(nsr[i]-nsl[i]-1));
return ans;
}
【问题讨论】:
-
我们需要足够的代码来复制问题。
-
请注意
int nsl[n];不是有效的 C++ -
C++ 没有变长数组。
-
int nsl[n];-- 如果n足够大,则说明您已耗尽堆栈内存。不要这样做,无论如何它都不是有效的 C++。使用std::vector<int> nsl(n), nsr(n);。此外,您链接到的那个网站包含糟糕的 C++ 代码示例。哇哦,去那个网站并使用 Visual C++ 的人。他们必须将正在使用的糟糕、无效的 C++ 语法转换为有效的语法,以便它可以编译。 -
@user4581301 -- 如果使用
std::vector解决了整个问题,那么这个问题应该被存档,并成为说明为什么这些网站是垃圾编码网站的主要例子。