找出数组中重复的数字。
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
示例 1:
输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3
限制:
2 <= n <= 100000
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路1
字典法
class Solution(object):
def findRepeatNumber(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
dict={}
for i in nums:
if i not in dict:
dict[i]=1
else:
return i
执行结果:
通过
显示详情
执行用时 :32 ms, 在所有 Python 提交中击败了90.27%的用户
内存消耗 :19.8 MB, 在所有 Python 提交中击败了100.00%的用户
思路2
排序后遍历比较
class Solution(object):
def findRepeatNumber(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
nums.sort()
tmp=nums[0]
for i in nums[1:]:
if tmp==i:
return tmp
tmp=i
执行结果:
通过
显示详情
执行用时:48 ms, 在所有 Python 提交中击败了31.78%的用户
内存消耗:19.5 MB, 在所有 Python 提交中击败了100.00%的用户
思路3
如果列表中没有重复值,那么应该列表索引与索引指向的值一一对应。逐个判断索引与索引对应值是否相等,如果相等,则继续下一个索引,如果不相等,则判断索引对应的值与该值作为索引的数是否重复,如重复则输出,不重复则进行交换操作。
注意点:
交换数字应该这样书写
nums[nums[i]], nums[i] = nums[i], nums[nums[i]]
而不能写成
nums[i], nums[nums[i]] = nums[nums[i]], nums[i]
原因是该种写法会首先修改nums[i]的值,造成nums[nums[i]]中的索引值造成改变
class Solution(object):
def findRepeatNumber(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
for i in range(len(nums)):
while i != nums[i]:
if nums[i] == nums[nums[i]]:
return nums[i]
nums[nums[i]], nums[i] = nums[i], nums[nums[i]]
执行结果:
通过
显示详情
执行用时:32 ms, 在所有 Python 提交中击败了87.67%的用户
内存消耗:20 MB, 在所有 Python 提交中击败了100.00%的用户