【算法】排序:变异排序 数组中重复的数字
在一个长度为 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之外的数字