所以我有一个非常简单的问题。我有一个数字列表1-N(迭代1),列表中的一个数字丢失。我试图确定我的两个解决方案中的哪一个在Big-Oh方面更快。
第一种算法: 对列表进行排序,然后一次遍历列表中的一个数字,直到找到比最后一个数字大1位数的数字。此时已找到丢失的数字。
第二种算法: 我按原样保留清单。我创建另一个数组,所有数字1-N已经排序。我遍历这个新列表中的每个数字,并将其与原始列表中的数字进行比较。一旦我在原始列表中找到该号码,我就从列表中删除该号码(并在这样做时减小该列表的大小,假设这是一个动态数据结构)。我为每个号码都这样做。如果一个数字遍历整个列表并且列表大小相同,那就是缺少的数字。
我认为算法2会更快,只是因为它减少了列表的大小而且最多只能完成1次完整传递,最多它应该是O(1)(如果你点击了搜索右边的数字)蝙蝠)。
第一个算法是O(nlogn),因为你正在进行排序,然后再次迭代列表。
或许他们都是O(nlogn)?自从昨晚以来,这一直困扰着我,因为这看起来很简单。
答案 0 :(得分:10)
计算它们的总和然后从它应该是的总和(n(n + 1)/ 2)中取得计算的总和
ShouldBeSum = N * (N+1) / 2;
MissingNumber = ShouldbeSum - CalculatedSum
答案 1 :(得分:1)
只是补充kikyalex的答案,第二种算法会更慢,因为对于排序列表中的每个数字,您必须在原始列表中找到它,每次执行O(n)搜索。所以第二个算法是O(n ^ 2)。
答案 2 :(得分:0)
首先是O(n * logn)+ O(n)即O(n * logn),而第二个是O(n ^ 2),因为平均搜索需要O(n)并且n元素因此需要O( N * N)。
答案 3 :(得分:0)
如所描述的第二个(改变第二个列表的长度)是O(N ^ 2)
然而,它可以做成O(N)稍作修改(虽然也是O(N)内存) 首先找到列表中的最小值O(N) 然后初始化一个全零布尔数组,列表O(N)的大小全为false 每次将数组[number-minNumber]更改为true O(1)时,查看第一个列表O(N)* 检查数组是否为O(N) 所以总O(N),并与重复
虽然如果你答应没有重复,那么Alexandru Chichinete的答案更快(并且记忆更少)一旦修改到一分钟不是很简单,这很容易 (原始问题中从未提及最小数字1)