在整数数组

时间:2015-06-08 14:07:59

标签: java c++ algorithm

我在考试中得到了这个问题:

  

给定一个整数数组,找到第一个使用O(N)时间复杂度和O(1)空间复杂度在数组中不重复的数字。

我无法想到任何解决方案。我知道我可以迭代数组并维护一个linkedhashmap,它将存储数组元素和它出现的次数,然后最后我必须搜索hashmap来找到那个数字。空间复杂度大于O(1),但我无法想到其他解决方案。

我也仔细阅读了问题,并说数组的最大尺寸为100万。我认为如果我们可以创建一个自定义散列图,它将使用100万大小的固定大小的数组,那么这可以在O(1)空间复杂度中实现,因为在这种情况下,所需的存储将是恒定的,但如果我是正确的则不确定。如果有任何其他解决方案,请告诉我。

4 个答案:

答案 0 :(得分:1)

如果除了一个元素之外的所有元素都有两个(或两个的倍数)条目,这些条目将是非重复的,您可以使用XOR运算符。

示例:

int x=arr[0];
for(i=1;i<1000;i++)
  x^=a[i];
printf("Non-repeating: %d",x);

与自身进行异或的任何数字都是0.因此,如果任何数字出现两次,则在整个XOR结果中将为0,因此只留下x中的非重复数字。

注意:如果您有100万个数字,那么存储XOR结果的变量必须足够大。

答案 1 :(得分:1)

在给定的整数数组中找到第一个非重复数

更新:找到更好的解决方案。 我认为我们可以使用其他数据结构(如HashMap)在O(n)时间复杂度下解决它。遍历数组,并将元素作为键,元素的索引位置在数组中作为映射中的值。如果密钥已存在,则可以删除键值对或仅将值设置为-1。 遍历整个数组后,我们可以从hashmap中获取keySet(),然后找到具有最低值的键(忽略-1)。 所以这就是 时间复杂度:O(N) 空间复杂度:O(N)

旧解决方案:我们可以通过创建另一个通过对给定数组进行排序而获得的数组来解决这个问题。这需要O(nlogn)时间。 然后我们可以迭代给定输入数组中的每个元素,尝试找到元素&amp;与排序数组中的下一个元素进行比较,如果重复继续给定数组中的下一个元素,如果不重复,则我们在给定的整数输入数组中找到第一个非重复元素。

时间复杂度:O(nlogn)
空间复杂度:O(n)

P.S:对不起,没看过所​​有的评论,詹姆斯坎泽已经在评论中提供了这个解决方案,给了他信用。

答案 2 :(得分:0)

我是使用PowerShell

完成的
[int[]]$arr = @(6,2,1,2,6,1,7)

$Collection = New-Object 'System.Collections.Generic.list[System.Object]'
$props=[ordered]@{"Index"=9999;"Value"=9999;"Numcount"=9999}
$record = New-Object -TypeName psobject -Property $props
$Collection.Add($record) #This record is added to do a Contains operation 
#for future items to be added in the $collection object

for($i =0;$i -lt $arr.Length;$i++)
{
if($i -eq 0)
{
    $props=[ordered]@{"Index"=$i;"Value"=$arr[$i];"Numcount"=1}
    $record = New-Object -TypeName psobject -Property $props
    $Collection.Add($record)
}


elseif($Collection.value.Contains($arr[$i]))
{

    $count = ($Collection | ?{$_.Value -eq $arr[$i]} | select -First `
1).Numcount
    ($Collection | ?{$_.Value -eq $arr[$i]} | select -First 1).Numcount = `
$count+1
}
else
{
    $props=[ordered]@{"Index"=$i;"Value"=$arr[$i];"Numcount"= 1}
    $record = New-Object -TypeName psobject -Property $props
    $Collection.Add($record)
}

}
Write-Output "The first non repeating number in the array is listed below"
$Collection | Sort-Object Numcount -Descending | ?{$_.Numcount -eq 1} | 
Select -First 1

OUTPUT:-
The first non repeating number in the array is listed below
Index Value Numcount
----- ----- --------
6     7        1

答案 3 :(得分:-4)

我相信解决问题的诀窍是:

  

数组的最大大小为1百万

因为:

  

O(1)空间表示算法所需的内存常量

然后,在给定常数1M的情况下,空间复杂度将自动变为O(1)。注意。 1M仍然是一个常数,即使它是一个非常大的数字。因此我们只需要专注于时间的复杂性。

使用LinkedHashMap我们可以使用O(1)添加新元素,并使用O(1)检索元素,因此更新条目也需要O(1)。它还preserves the order。因此,我们可以找到最早的条目

然后问题将分两步变得简单:

  1. 建立LinkedHashMap - &gt;为O(n)
  2. 找到其计数为0的最早数字 - &gt;为O(n)
  3. 上述每个步骤都需要O(n),因此整体time complexityO(2n) = O(n)