问题描述
您好,我正在尝试使用暴力破解方法解决Geeks for Geeks上的一个问题,所以问题陈述是
给出一个正整数数组。您的任务是在阵列中找到领导者。 注意:如果array的一个元素大于或等于其右侧的所有元素,则为leader。另外,最右边的元素始终是领导者。
输入: 输入的第一行包含一个整数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)
我了解这是什么,但无法确定我在哪里做错了。
解决方法
该问题表明N
最多为10 ** 7(10,000,000),但是您仅为A
和leader
的元素分配了10个元素。您必须分配足够的元素。
要意识到这一点,有几点:
- 数组
A
在堆栈上分配。在某些环境中,堆栈限制为几MB,因此应将其标记为static
才能将其从堆栈中取出。 - 仅将
int leader[100][10];
更改为int leader[100][10000000];
会导致告诉他们分配过多的内存。为避免这种情况,您应该只分配一个查询,并在阅读完每个查询后对其进行回答,而不要为所有查询保留答案。
该错误已向您指出,但不值得修复。您的尝试太复杂了,似乎没有一个简单的解决方案:一个循环,以相反的顺序搜索数组 ,并保持跟踪每次发现的值都比迄今为止看到的最大值高的值。就是这样。
问题表明值是正数,因此我们可以简单地将低水位标记初始化为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];
}
}
}
就是这样。上面将使用一个简单的循环,无需任何复杂的逻辑,即可找到阵列中所有所谓的“领导者”。根据定义,这将获取数组中所有高于以下所有值的值。当 向后 搜索数组时,解决方案变得更加简单。只需按倒序的顺序跟踪看到的最高值,然后将其命名为一天即可。
我在问题中找不到任何内容可以说明是否必须按其原始顺序显示领导者值。上面的代码将以相反的顺序查找/打印值。如果必须按原始出现顺序报告它们,只需将每个值保存在单独的数组中,然后以相反的顺序打印 那个 数组。任务完成了。
,在更新后的代码中,您似乎在 long *A = new long(N);
上有一个错字,我相信您想要 long *A = new long[N];
无论如何,您都在使事情复杂化。首先,使用std::vector
消除所有内存分配内容。其次,完全处理每个测试用例-也就是说,直到所有测试用例都完成后才保存打印。运行一个测试用例并打印该测试用例的结果。重复。
这是一个例子:
#include <iostream>
#include <vector>
#include <cstdint>
int main() {
uint32_t T;
std::cin >> T;
while (T--) {
uint32_t N;
std::cin >> N;
// Create input vector and read data
// The parameter tells the vector the initial size
std::vector<uint32_t> data(N);
for (auto i = 0; i < N; i++) {
std::cin >> data[i];
}
// max is the maximum value at each iteration of the loop
// Initialized to the last value of the array
uint32_t max = data.back();
std::vector<uint32_t> results;
// Move backwards through the input (i.e. right to left)
for (auto it = data.rbegin(); it != data.rend(); it++) {
// If current value is > any value to the right
if (*it >= max) {
results.push_back(*it);
max = *it;
}
}
// Print in reverse order before moving on to next test case
for (auto it = results.rbegin(); it != results.rend(); it++) {
std::cout << *it << " ";
}
std::cout << "\n";
}
return 0;
}
注意:如果不需要按特定顺序打印结果,则可以消除results
向量,并在找到时仅打印一个数字。
此外,您可以在主循环之前创建一次矢量,并根据需要调整它们的大小。不确定会节省多少执行时间。
,#include <iostream>
#include <stack>
using namespace std;
void leader_in_array(long *A,long N) {
long check = 0;
stack<long> leader;
for (long j = N - 1; j >= 0 ; j--)
{
if (check <= A[j])
{
check = A[j];
leader.push(check);
}
}
while (leader.empty() == false)
{
cout << leader.top() << " ";
leader.pop();
}
}
int main() {
long T;
cin >> T;
for (long i = 0; i < T; i++)
{
long N;
cin >> N;
long A[N];
for (long j = 0; j < N; j++)
{
cin >> A[j];
}
leader_in_array(A,N);
cout << endl;
}
return 0;
}