剑指03:数组中重复的数字

题目:剑指 Offer 03. 数组中重复的数字(E)

image

解题思路1:

首先看到题,第一眼就想到使用字典、列表或者集合等容器进行存储,如果查到在容器中已经存在,则返回该数。
时间:\(O(N)\)
空间:\(O(N)\)

class Solution:
    def findRepeatNumber(self, nums: List[int]) -> int:
        dic = {}
        for i in nums:
            if i in dic:    return i
            dic[i] = 1
        return
优质解答:原地交换(参考自K神

遍历数组,由于数组的特殊性,n个数的大小都在\([0,n-1]\)内,碰到数则判断其是否在自己按照大小排序的位置上,如0应该在数组的第一位即nums[0],如果不在,则将其与自己顺位上的数进行交换同时进行判断,如果该数与自己相同,则代表遇到了重复数字,直接将其返回即可;如果不同,则进行交换,交换后此时自己已经在顺位上,此时继续判断交换的数是否来到他的顺位上,如果不在其顺位上则继续进行交换,直到进行交换的两个数都来到顺位上,此时i+1继续往后遍历直到数组末端。
时间:\(O(N)\)
空间:\(O(1)\)

class Solution:
    def findRepeatNumber(self, nums: List[int]) -> int:
        for i in range(len(nums)):
            while nums[i] != i:
                if nums[i] == nums[nums[i]]: return nums[i]
                nums[nums[i]], nums[i] = nums[i], nums[nums[i]]
        return
遇到问题及解决方法:
  • 在选用容器时需要注意其查找的时间复杂度,list的查找复杂度为\(O(N)\),字典和集合则是\(O(1)\),其本质都是哈希表,Python3.7以后字典为有序,而集合无序,所以一般选用字典即可。
posted @ 2022-04-01 19:48  面包房主人  阅读(23)  评论(0)    收藏  举报