【脚趾offer-03】数组中的重复数字

221 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情

一、题目描述

找出数组中重复的数字。

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

请找出数组中任意一个重复的数字。

示例 1:

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

二、思路分析:

这个问题有多种思路: 核心关键在于寻找到有相同的数值,找到一个就可以返回

2.1 使用数组记录

时间复杂度O(n) 空间复杂度O(N)

var findRepeatNumber = function(nums) {
    const map = [] // 记录是否使用
    for(const num of nums){
        if(map[num]){
            return num
        }
        map[num] = true
    }
};

2.2 排序

通过给nums排序的方式,然后判断某个元素是否等于前一个元素,找到就可以返回了。 时间复杂度: O(NlogN) 这里sort排序底层就是快排或者归并排序了

var findRepeatNumber = function(nums) {
    nums.sort((a,b)=>a-b)
    for(let i=0;i<nums.length;i++){
        if(i!=0&&nums[i]==nums[i-1])return nums[i]
    }
};

2.3 哈希表+原地交换(最优解)

var findRepeatNumber = function(nums) {
    const obj = {}
    let cur
    for(let i=0;i<nums.length;i++){
        cur = nums[i]
        if(obj[cur]){
            return cur
        }else{
            obj[cur] = true
        }
    }
};

三种解决办法提交截图

image.png

四、总结:

  • 第三种解法使用对象会比使用map更加快(毕竟map的实现思路就是通过key-value的形式) 本文剑指offer第一篇就到这里啦,欢迎👍