春招打卡|数组中重复的数字

150 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述

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

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

二、思路分析

  1. 重复元素可以考虑暴力法筛选是否有重复,两层for循环,枚举所有可能,但是时间复杂度为O(n2)。
  2. 可以考虑对元素进行排序,使用内置排序算法,如果相邻两个元素重复则代表存在重复元素,时间复杂度为O(nlogn)。
  3. 这道题目可以使用空间换时间的思想,创建一个哈希表,哈希表中存储已经出现的元素,后续元素如果在哈希表中出现过,则代表有重复元素存在,这样时间复杂度可以转换为O(n),随之带来的空间复杂度为O(n2)。

三、AC 代码

快排做法

func findRepeatNumber(nums []int) int {
	sort.Ints(nums)
	for i := 1;i<len(nums);i++ {
	if nums[i] == nums[i-1] {
		return nums[i]
		}	
	}
	return 0
}

哈希表做法

func findRepeatNumber(nums []int) int {
    m := make(map[int]bool,0)
    for _,val := range nums {
        if _,ok := m[val];ok {
            return val
        }
        m[val] = true
    }
    return 0
}

四、总结

首先考虑到的是暴力破解,大部分题目都可以暴力破解,但是时间复杂度必然较高。优化考虑到使用快排进行排序后处理,时间复杂度降低为O(nlogn)。进一步采用空间换时间思想将时间复杂度降低为O(n)。