数组中重复的数字——哈希表,空间换时间

2021年10月28日

题目:

在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。

示例:

示例一:

输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3 

限制:

2 <= n <= 100000

思路

这道题目只要做过类似的用哈希表的题目,就很容易想到思路,典型的空间换时间。遍历一遍数组,将每个遍历到的数字都记录在一个哈希表中。这个哈希表中的每一个键代表当前已经遍历过的一个数字,当遍历到一个哈希表中存在的数字时,就说明这个数字重复了,返回它。这种方法的空间复杂度是 O(2n),而时间复杂度只有 O(n)。

如果不用哈希表记录的话,对于每一个数字,都遍历一遍数组,查看是否有与之相等的数字。这样的时间复杂度是 O(n^2),空间复杂度是 O(n)。明显使用空间换时间很划算。

代码

function findRepeatNumber(nums: number[]): number {
  const map = new Map();
  for(let i=0; i<nums.length; i++){
      const num = nums[i];
      if(map.has(num)){
          return num
      } else {
          map.set(num, 1);
      }
  }
  return -1;
};

相关阅读


© 2022, 分享知识和生活,记录成长与感动。