在整数数组中查找第一个非重复数

我有一个问题要考试:

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

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

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

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

例:

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

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

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

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

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

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

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

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

我使用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 

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

数组的最大大小为100万

自:

O(1)空间意味着算法所需的存储器是恒定的

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

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

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

  1. 构建LinkedHashMap – > O(n)
  2. 找到其计数为0的最早数字 – > O(n)

上述每个步骤都需要O(n),因此总time complexityO(2n) = O(n)