给定两个大小为 N 的整数数组,设计一种算法来确定一个是否是另一个的排列。也就是说,它们是否包含完全相同的条目,但可能以不同的顺序。
我可以想到两种方法:对它们进行排序并比较:O(N.log N + N)
检查数组是否有相同数量的整数并且这些整数的和是否相同,然后对两个数组进行异或,看看结果是否为 0。这是 O(N)。我不确定这种方法是否会完全消除误报。想法。更好的算法?
给定两个大小为 N 的整数数组,设计一种算法来确定一个是否是另一个的排列。也就是说,它们是否包含完全相同的条目,但可能以不同的顺序。
我可以想到两种方法:对它们进行排序并比较:O(N.log N + N)
检查数组是否有相同数量的整数并且这些整数的和是否相同,然后对两个数组进行异或,看看结果是否为 0。这是 O(N)。我不确定这种方法是否会完全消除误报。想法。更好的算法?
检查数组是否有相同数量的整数并且这些整数的和是否相同,然后对两个数组进行异或,看看结果是否为 0。
这行不通。例子:
a = [1,6] length(a) = 2, sum(a) = 7, xor(a) = 7
b = [3,4] length(b) = 2, sum(b) = 7, xor(b) = 7
其他人已经建议HashMap
使用 O(n) 解决方案。
这是使用 C# 的 O(n) 解决方案Dictionary<T, int>
:
bool IsPermutation<T>(IList<T> values1, IList<T> values2)
{
if (values1.Count != values2.Count)
{
return false;
}
Dictionary<T, int> counts = new Dictionary<T, int>();
foreach (T t in values1)
{
int count;
counts.TryGetValue(t, out count);
counts[t] = count + 1;
}
foreach (T t in values2)
{
int count;
if (!counts.TryGetValue(t, out count) || count == 0)
{
return false;
}
counts[t] = count - 1;
}
return true;
}
在 Python 中,您可以使用Counter
该类:
>>> a = [1, 4, 9, 4, 6]
>>> b = [4, 6, 1, 4, 9]
>>> c = [4, 1, 9, 1, 6]
>>> d = [1, 4, 6, 9, 4]
>>> from collections import Counter
>>> Counter(a) == Counter(b)
True
>>> Counter(c) == Counter(d)
False
如果空间复杂度O(n)
不是问题,您可以O(n)
通过首先将第一个数组中每个值的出现次数存储在哈希映射中,然后在第二个数组上运行第二遍并检查每个元素存在于地图中,减少每个元素的出现次数。
最好的解决方案可能是使用其键是两个数组中的值的映射进行计数。
通过一个数组创建/增加适当的地图位置,并通过另一个数组创建/减少适当的地图位置。
如果生成的映射完全由零组成,则您的数组是相等的。
这是 O(N),我认为你不能做得更好。
我怀疑这大概就是 Mark Byers 在他的回答中想要的。
对两个数组的内容进行数字排序,然后比较每个第 n 项。
您还可以获取 array1 中的每个项目,然后检查它是否存在于 array2 中。数一数你找到了多少匹配项。最后,匹配的数量应该等于数组的长度。