存在重复元素

题目

给定一个整数数组,判断是否存在重复元素。
如果存在一值在数组中出现至少两次,函数返回 true 。如果数组中每个元素都不相同,则返回 false

示例 1:

输入: [1,2,3,1]
输出: true

示例 2:

输入: [1,2,3,4]
输出: false

示例3:

输入: [1,1,1,3,3,4,3,2,4,2]
输出: true

解法一

解题思路

这种方式有点取巧,是通过 new Set 的方式先对数组去重,然后判断去重后的数组长度与原数组的长度是否相等。
若相等则存在重复值,否则不存在重复值。

/**
 * 通过new Set的方式判断
 * @param nums
 */
function testContainsDuplicateBySet (nums: number[]): boolean {
  // 如果数组长度小于2,则不可能出现重复,返回false即可
  if (nums.length < 2) return false
  // 利用new Set去重
  return Array.from(new Set(nums)).length !== nums.length
}

解法二

解题思路

利用 new Mapkey 不能重复的特性,创建哈希表,创建完成后,判断所有key的数量与原数组是否相等。
若相等则存在重复值,否则不存在重复值。

/**
 * 通过new Map的方式判断
 * @param nums
 */
function testContainsDuplicateByMap (nums: number[]): boolean {
  // 如果数组长度小于2,则不可能出现重复,返回false即可
  if (nums.length < 2) return false
  // 利用map的key不可以重复的特性判断是否重复
  const map = new Map()
  for (let i = 0; i < nums.length; i++) {
      map.set(nums[i], i)
  }
  return Array.from(map.keys()).length !== nums.length
}

解法三

解题思路

这种方式是遍历数组,将元素值缓存起来,且在遍历的过程中查询缓存的数组中是否存在当前遍历的元素。
若存在则返回 true。如果可以遍历完,则说明不存在重复元素,返回 false

注意

这种方式性能较差, 执行时间较长。

/**
 * 通过遍历搜索的方式判断
 * @param nums
 */
function testContainsDuplicate (nums: number[]): boolean {
  // 如果数组长度小于2,则不可能出现重复,返回false即可
  if (nums.length < 2) return false
  // 申请额外数组空间,循环判断,存在则返回true, 性能太差。。。
  const arr: number[] = []
  for (const num of nums) {
    if (arr.includes(num)) {
      return true
    } else {
      arr.push(num)
    }
  }
  return false
}
Last Updated:
Contributors: luhaifeng