【算法】排序:变异排序 数组中重复的数字

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

 

def findRepeatNumber(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        for i in range(0, len(nums)):
            if nums[i] != i:
                while nums[i] != i:
                    if nums[i] == nums[nums[i]]:
                        return nums[i]
                    else:
                        p = nums[nums[i]]
                        nums[nums[i]] = nums[i]
                        nums[i] = p
        return False

思路:

数组中的数字都在 0~n-1的范围内,如果这个数组中没有重复的数字,那么当数组排序之后数字i将出现在下表为i的位置,即 nums[i] == i

从头到尾一次扫描这个数组中的每个数字,当扫描到下标为i的数字时,首先比较是不是nums[i] == i,如果是,就扫描下一个数字,如果不是就比较是不是nums[i] == nums[nums[i]](当位),如果nums[i] == nums[nums[i]],则该数字是重复的,如果不相符,则这两个值互换,直到找到重复数字,或者找到当位数字。

 

 

复杂度:

虽然有两重循环,但是每个数字最多交换2次就能找到它的位置,时间复杂度O(n)

不需要额外分配内存,空间复杂度O(1)

 

 

 

 

测试用例:

1. 长度为n的数组包含1个或者多个重复数字

2. 数组中不包含重复数字

3. 无效输入测试用例

  1. 空

  2. 包含0~n-1之外的数字

 

posted @ 2020-12-06 19:20  刘玉璇  阅读(183)  评论(0编辑  收藏  举报