本文最后更新于:2020年11月12日 下午

剑指Offer03-数组中重复的数字

找出数组中重复的数字

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

示例1

输入:
[2310253]
输出:
23

限制

2<=n<=100000

方法一:遍历数组

由于只需要找出数组中任意一个重复的数字,因此遍历数组,遇到重复的数字即返回。为了判断一个数字是否重复遇到,使用集合存储已经遇到的数字,如果遇到的一个数字已经在集合中,则当前的数字是重复数字。

  • 初始化集合为空集合,重复数字repeat = -1
  • 遍历数组汇总的每个元素:
    • 将该元素加入集合中,判断是否添加成功
      • 如果添加失败,说明该元素已经在集合中,因此该元素是重复元素,将该元素的值赋给repeat,并结束遍历。
  • 返回repeat

复杂性分析

  • 时间复杂度:O(n)。
    • 遍历数组一遍。使用哈希集合(HashSet),添加元素的时间复杂度为O( 1),故总的时间复杂度为O(n)。
  • 空间复杂度:O(n)。不重复的每个元素都可能存入集合,因此占用O(n)额外空间。
class Solution:
	def findRepeatNumber(self, nums):
	temp_set = set()
	repeat = -1
	for i in range(len(nums)):
	temp_set.add(nums[i])
	if len(temp_set) < i + 1:
		repeat = nums[i]
		break
	return repeat

方法二:利用python的sort函数排序,然后计算相邻两个数据是否相等即可。

class Solution:
	def findReatNumber(self, nums):
	nums.sort()
	for i in range(len(nums) - 1):
		if nums[i] == nums[i+1]:
			return nums[i]

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!

剑指Offer05-替换空格 上一篇
leetcode922-按奇偶排序数组II 下一篇