【问题标题】:Finding first non-repeating number in integer array在整数数组中查找第一个非重复数
【发布时间】:2015-08-23 01:13:51
【问题描述】:

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

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

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

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

【问题讨论】:

  • 也许它指的是不重复的连续数字,在这种情况下,您只需将一个数字与前一个数字进行比较?这似乎微不足道,但这只是一个快速的想法。
  • 我不认为仅仅因为你使用了一个固定大小的Collection,就意味着空间复杂度是1...
  • @AbishekManoharan 修复大小集合的空间复杂度为 1
  • @nafas 不,如果集合大小为 N,那么显然它不是 O(1) 大小的复杂度,而是 O(N)。
  • 请发布确切的问题陈述。有时他们试图欺骗你,这比你想象的要简单。

标签: java c++ algorithm


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    旧解决方案:我们可以通过创建另一个数组来解决这个问题,该数组是通过对给定数组进行排序获得的。这将花费O(nlogn) 时间。 然后我们可以遍历给定输入数组中的每个元素,尝试找到该元素并与排序数组中的下一个元素进行比较,如果重复,则继续给定数组中的下一个元素,如果不重复,那么我们找到了第一个不重复的元素给定输入整数数组中的元素。

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

    P.S:很抱歉,没有阅读所有的 cmets,James Kanze 已经在 cmets 中提供了这个解决方案,感谢他。

    【讨论】:

      【解决方案3】:

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

      数组的最大大小为 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)

      【讨论】:

      • 这样你就可以让any算法在恒定空间内执行。我怀疑这个“技巧”是这里所期望的。不在考试作业中。
      • @JensG 如果有上限,则可以使空间复杂度保持不变
      • 你回复错点了。关键是考试中很可能没有技巧问题。即使有一个,也不是那么愚蠢的。
      • 这是 O(n) 大小的复杂度。恒定空间复杂度的真正含义是算法的空间需求不依赖于输入大小。如果您的算法使用 4 个字节来处理 100 个元素,那么它应该使用相同的 4 个字节来处理 1000 亿个元素,才能说具有恒定的空间复杂度。
      • @nafas...复杂度是针对算法确定的...不是针对问题...仅仅因为此问题的上限为 1M 并不意味着您的算法具有 ao(1)复杂性...
      【解决方案4】:

      如果除了一个不重复的元素之外的所有元素都恰好有两个(或 2 的倍数)条目,则可以使用 XOR 运算符。

      例子:

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

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

      注意:如果你有一百万个数字,存储异或结果的变量必须足够大。

      【讨论】:

      • -1,对不起。这个答案是正确的,但它没有回答 OP 的问题。第一句话相当于“如果这是一个不同的问题,您可以使用 XOR 运算符。”
      • 这似乎没有解决问题,什么是数组是[1,2,3,1]?那怎么回答2?
      • @nafas:请仔细阅读我回答的第一行。我刚刚提供了思路,根据问题的要求实际实现的思路由求解者自己决定!
      • @skrtbhtngr 对不起,伙计,考虑到它可以工作的条件
      • 假设数组是[11,26,35,26,11],那么对所有元素进行异或运算会得到答案:35。这是异或运算的一个属性。如果操作数相等,异或运算返回 0,因此只留下非重复元素。
      猜你喜欢
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 2017-01-04
      • 1970-01-01
      • 2018-07-28
      • 1970-01-01
      • 2017-02-17
      • 2017-09-22
      相关资源
      最近更新 更多