我在C语言编程方面仍然是新手,所以请仔细解释。此外,这是一个家庭作业,所以如果你能帮助我解决这个问题,我会很高兴。我环顾了网站,只能找到类似这个问题的帖子。我找到的那些提到了像哈希表这样的东西,我没有学习,所以我怀疑可以使用那些东西。
对于我的作业,我有两个相同长度的未排序整数数组。它们只能有0-99范围内的整数。允许重复元素。目标是查看它们是否具有相同的元素,因此检查它们是否相等,而不对它们进行排序。我的教授还说它必须以线性时间运行,因此排序它们不是一种选择。
例如,
A[4]={1,2,3,4}
B[4]={4,3,2,1}
这些数组是相同的。然而,
A[3]={1,1,2}
B[3]={2,2,1}
这些数组不相等。
我想出的算法是这样的:
第一个for循环遍历第一个数组,内部for循环遍历第二个数组。它将检查第一个数组中的当前元素是否等于第二个数组中的元素。如果它们相等,那么外部循环迭代并且内部for循环再次从第一个元素开始,检查第一个数组中的当前元素是否与第二个元素中的元素匹配。如果没有,则它退出两个循环并返回0表示它们不相等。该算法不在线性时间内运行。此外,它不会检查重复项,因为内部for循环每次都会检查第二个数组中的所有元素。
每当发现第二个数组中的元素值等于第一个数组中的元素时,我就会想到将第二个数组中元素的值更改为非常大的值。我认为这样可以摆脱重复的问题。但我仍然需要帮助制作更快的算法并理解我的错误。谢谢。
答案 0 :(得分:3)
只需重新考虑您的任务:您必须确定一个阵列是否是另一个阵列的排列。要解决这个问题,你只需要检查每个数组中有多少个零,一个,......,99。也就是说,
int count[100]
初始化为全零count[a[i]]
并递减count[b[i]]
count[]
由全零组成,那么[]和b []是排列。答案 1 :(得分:1)
一个好的,简单的解决方法是:
结果全部为O(n log n)
答案 2 :(得分:0)
要注意的三件事:数组1和数组2的元素之和,乘以
数组1和数组2的元素,以及它们的零计数。如果满足,则它们是相等的。
#include
int main(void)
{
int A[4] = { 4 , 3 , 2 , 1 };
int B[4] = { 6 , 2 , 1 , 1 };
int varA = 1 , varB = 1;
int sumA = 0 , sumB = 0;
int zeroCountA = 0 , zeroCountB = 0;
for( int n = 0 ; n < 4 ; n++ )
{
if( A[n] != 0)
{
varA *= A[n];
sumA += A[n];
}
else
{
zeroCountA++;
}
}
for( int n = 0 ; n < 4 ; n++ )
{
if( B[n] != 0)
{
varB *= B[n];
sumB += B[n];
}
else
{
zeroCountB++;
}
}
if( sumA == sumB )
{
if( varA == varB )
{
if( zeroCountA == zeroCountB )
printf("A = B\n");
}
else
{
printf("A != B\n");
}
}
else
{
printf("A != B\n");
}
}