给定两个大小为N的整数数组,设计一种算法来确定一个是否是另一个的排列。也就是说,它们是否包含完全相同的条目,但可能的顺序不同。
我可以想到两种方式: 对它们进行排序并进行比较:O(N.log N + N)
检查数组是否具有相同的整数数,并且这些整数的总和是相同的,然后对这两个数组进行异或,看看结果是否为0.这是O(N)。我不确定这种方法是否能完全消除误报。思考。更好的算法?
答案 0 :(得分:3)
检查数组是否具有相同的整数数,并且这些整数的总和是相同的,然后对两个数组进行异或,看看结果是否为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#中使用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
答案 1 :(得分:2)
如果O(n)
的空间复杂度不是问题,可以在O(n)
中执行此操作,首先在哈希映射中存储第一个数组中每个值的出现次数,然后在第二个数组上运行第二次传递并检查映射中是否存在每个元素,减少每个元素的出现次数。
答案 2 :(得分:2)
最好的解决方案可能是使用地图进行计数,地图的键是两个数组中的值。
通过一个数组创建/递增相应的地图位置,然后通过另一个数组创建/递减相应的地图位置。
如果生成的地图完全由零组成,则数组相等。
这是O(N),我认为你不能做得更好。
我怀疑这与Mark Byers在回答中的内容大致相同。
答案 3 :(得分:0)
以数字方式对两个数组的内容进行排序,然后比较每个第n项。
您还可以获取array1中的每个项目,然后检查它是否存在于array2中。记下你找到的匹配数量。最后,匹配的数量应该等于数组的长度。