首页 > 解决方案 > Geeks for Geeks 问题中的分段错误 (SIGSEGV)

问题描述

嗨,我试图使用 brute for 方法解决 Geeks for Geeks 上的一个问题,所以问题陈述是,

给定一个正整数数组。你的任务是找到阵列中的领导者。注意:如果数组的元素大于或等于其右侧的所有元素,则该元素是领导者。此外,最右边的元素始终是领导者。

输入:输入的第一行包含一个整数 T,表示测试用例的数量。T 测试用例的描述如下。每个测试用例的第一行包含一个整数 N,表示数组的大小。第二行包含 N 个用空格分隔的整数 A1、A2、...、AN,表示数组的元素。

输出:打印所有的领导者。

Constraints:
1 <= T <= 100,
1 <= N <= 107,
0 <= Ai <= 107

Example:
Input:
3
6
16 17 4 3 5 2
5
1 2 3 4 0
5
7 4 5 7 3
Output:
17 5 2
4 0
7 7 3

我开发了如下解决方案,

#include <iostream>

using namespace std;

long **leader;
long *cond; 

void leader_in_array(long *A,long N,long i) {
    long check = 0, count = 0;
    for (long j = N - 1; j >= 0 ; j--)
    {
        if (check <= A[j])
        {
            check = A[j];
            leader[i][count] = check;

            count++;
        }   
    }   

    cond[i] = count;
}

int main() {
    long T;

    cin >> T;

    leader = new long*[T];
    cond = new long(T);

    for (long i = 0; i < T; i++)
    {
        long N;
        cin >> N;
        long *A = new long(N);
        leader[i] = new long[N];

        for (long j = 0; j < N; j++)
        {
            cin >> A[j];
        }

        leader_in_array(A, N, i);

        delete [] A;

    }

    for (long i = 0; i < T; i++)
    {
        
        for (long j = cond[i] - 1; j >=0 ; j--)
        {
            cout << leader[i][j] << " ";
        }
        cout << endl;
        
    }

    delete [] leader;
    delete [] cond;
    
    return 0;
}

它适用于测试用例,但是当我尝试在实际用例中提交我的代码时,我收到了错误

分段错误 (SIGSEGV)

我了解它是什么,但无法确定我在哪里做错了。

标签: c++arraysalgorithmpointers

解决方案


该错误已向您指出,但不值得修复。您的尝试过于复杂,似乎有一个更简单、更简单的解决方案:一个循环,以相反的顺序搜索数组,并在每次发现高于所见最高值的值时简单地跟踪迄今为止。而已。

该问题指定值为正,因此我们可以简单地将低水位线初始化为 0,然后运行它。

void all_leaders_in_array(int *arr, size_t size)
{
    int highest=0;

    while (size > 0)
    {
        if (arr[--size] > highest)
        {
              // arr[size] is a "leader" value here,
              // do whatever you want with it, print it, etc...

              highest=arr[size];
        }
    }
}

而已。以上将在数组中找到所有所谓的“领导者”,使用一个简单的循环,没有任何复杂的逻辑。根据定义,这会抓取数组中高于所有以下值的所有值。向后搜索数组时,解决方案变得简单得多。只需按倒序跟踪看到的最高值,就可以结束了。

我在问题中找不到任何说明领导者值是否必须按原始顺序显示的内容。上面的代码将以相反的顺序查找/打印值。如果它们必须按其原始出现顺序进行报告,只需将每个值保存在一个单独的数组中,然后以相反的顺序打印该数组。任务完成。


推荐阅读