算法学习第八天

145 阅读1分钟

  今天学习一道简单题,是leetcode的 剑指Offer-03.数组中重复的数字。先上题目:

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

  第一种解法,可以用暴力双重要for循环进行对比,得出重复元素是哪个!不过这种时间复杂度为O(n^2),比较低效。

var findRepeatNumber = function (nums) {
    for (let i = 0; i < nums.length; i++) {
        for (let j = 0; j < nums.length; j++) {
            if (nums[i] == nums[j]) {
                return nums[i]
            }
        }
    }
};

  其实这道题和第一天学习的那道两数之和比较相似,可以利用空间换速度解决,利用一个map存储已经遍历过的元素,然后在后面进行对比,如果 map中已经存在说明该元素已经出现过,就可以直接返回结果了。这种解决的时间复杂度仅为O(n),比上面那种少了一倍的时间。

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

  今天复习一下之前学习的知识点。