这是《剑指Offer》的第一道题,数组中重复的数字的记录。

题目是这样的:

在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的, 但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。如 输入长度为7的数组{2, 3, 1, 0, 2, 5, 3},那么对应的输出应该为2或3。

下面来介绍两种方法,一种是我想到的解法,另一种是书中给出的解法。

先来说我这边想到的解法。这是一个查重问题,哈希表的一个特点就是可以处理查重。所以我第 一时间想到的是用哈希表来处理这个问题。在golang中创建一个map[int]bool的哈希表。遍历整个 数组a,如果map[a[i]] == false,那么让map[a[i]] = true。如果map[a[i]] == true,那么说明 找到了一个重复数字,则返回a[i]。算法的时间复杂度为O(n),空间复杂度为O(n)。这是我的 提交记录

说完了我的解法,再来看书中的解法。书中解法的核心是利用了题目中“在一个长度为 n 的数组 里所有数字都是 0~n-1 的范围内”这个条件,得出:如果这个数组中没有重复的数字,那么当数组 排序之后数字i应该在下标i的位置。而由于数组中有重复的数字,那么意味着有些位置可能有多个 数字,而有些位置则可能没有数字。那么我们可以利用这个结论对数组进行排序。在a[i] != i的情况下, 如果a[i] == a[a[i]],说明找到一个重复数字,那么return a[i]。否则交换a[i]与a[a[i]]。这个算法 的时间复杂度为O(n),因为不需要额外的空间,所以完全问题复杂度为O(1)。这是我的提交记录

以上。